Отказ от ответственности: я не знаю F #.
В scala, если у значения есть метод с именем unapply (или unapplySeq), он будет использоваться при сопоставлении с образцом.
Определение unapply:
object Example {
def unapply(t: T): Option[(T1, ..., Tn)] = ...
}
Если возвращено None
, это означает, что совпадения нет, Some((t1, ..., tn))
означает, что совпадение успешно и может быть привязано к значениям от t1 до tn
И затем его можно использовать как:
value match {
case Example(t1, ..., tn) => ...
}
Если сопоставление может иметь динамическое число результатов, то используется unapplySeq
, который возвращает Option[List[T]]
Наконец, если при сопоставлении не нужно связывать переменные, unapply может просто вернуть логическое значение
Примеры:
val Date = ""(\d{1,2})/(\d{1,2})/(\d{1,2})$".r
"12/12/12" match {
case Date(m, d, y) => ...
}
Метод .r
превращает строку в регулярное выражение.В этом классе есть метод unapplySeq, который соответствует группам в регулярном выражении.
case class Person(name: String, age: Int)
somePerson match {
case Person(name, age) => ...
}
В этом случае синтаксис case class
создает одноэлементный объект с тем же именем (Person) с неприменимым методом, соответствующим конструктору.Аргументы.
ОБНОВЛЕНИЕ: Вот как определить Четные и Нечетные Сначала небольшое обобщение.Even и Odd могут быть выражены через функцию, но мы должны привести эту функцию в соответствие со спецификацией экстракторов, то есть применить ее через unapply
class BooleanExtractor[T](f: T => Boolean) {
def unapply(t: T) = f(t)
}
Теперь мы можем использовать вот так (показаны дваспособы)
val Even = new BooleanExtractor[Int](_ % 2 == 0)
object Odd extends BooleanExtractor[Int](_ % 2 == 1)
и использование:
scala> 3 match {
| case Even() => println("even")
| case Odd() => println("odd")
| }
odd