Я немного запутался в экстракторе и его использовании. Я прочитал документ Scala и встретил его
object Twice {
def apply(x: Int): Int = x * 2
def unapply(z: Int): Option[Int] = if (z%2 == 0) Some(z/2) else None
}
object TwiceTest extends App {
val x = Twice(21) // x = 42
x match { case Twice(n) => Console.println(n) } // prints 21
}`
Как распечатывается приведенный выше код, когда мы вызываем x match {case Twice(n) ...
, это означает Twice(n)
--> Twice.unapply(n)
--> Twice.unapply(42)
и получаем Some(n/2)
--> Some(42/2)
и снова подставляем результат в n
, распечатываем 21
Если я изменю «отменить применение» следующим образом: def unapply(z: Int): Option[Int] = if (z%2 == 0) Some(z - 2) else None
То, что я получаю от консоли, это 40
Итак, я правильно понимаю?
n
, я имею в виду, здесь он обрабатываетn
как переменную. Я думаю, что это функционально, но это не так. Это сбивает меня с толку. - person hminle   schedule 26.04.2016Twice(n)
в этом контексте является шаблоном, и вы извлекаетеn
- person Giovanni Caporaletti   schedule 26.04.2016