Scala функция "принадлежитТо" - PullRequest
1 голос
/ 29 мая 2020

Я часто использую этот тип фильтрации:

allPeople
  .filter(person => englishPeopleIds contains person.id)

, и это сделало бы мою жизнь проще и мой код более читабельным, если бы была какая-то функция «ownTo» для выполнения следующее:

allPeople
  .filter(_.id belongsTo englishPeopleIds)

Функция принадлежитTo будет иметь такое поведение (но будет методом элемента):

def belongsTo[T](element: T, list: List[T]): Boolean = list contains element

Знаете ли вы, реализована ли такая функция в Scala?

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

Возможно, определите правоассоциативный оператор для последовательных коллекций, например,

implicit class ElementOf[A](l: Seq[A]) {
  def ∈: (a: A): Boolean = l contains a
}

, используя математический символ элемент из ∈, который подпадает под Scala символы оператора , а затем call-site становится

allPeople filter (_.id ∈: englishPeopleIds)

Чтобы он работал также для Set и Map, попробуйте определить в терминах Iterable#exists как так

implicit class ElementOf[A](cc: Iterable[A]) {
  def ∈: (a: A): Boolean = cc exists (_ == a)
}
1 голос
/ 29 мая 2020

Нет, но вы можете использовать неявный класс, чтобы сделать то же самое:

implicit class BelongsTo[T](private val t: T) extends AnyVal {
  def belongsTo(s: Seq[T]): Boolean = s.contains(t)
  def belongsTo(s: Set[T]): Boolean = s.contains(t)
}

В Dotty вы можете сделать это:

def [T](t: T).belongsTo(s: Seq[T]): Boolean = s.contains(t)
def [T](t: T).belongsTo(s: Set[T]): Boolean = s.contains(t)

Честно говоря, это не так. Кажется, оно того стоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...