我对提取器及其使用感到困惑。我阅读了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
如果我改变了#34; unapply"如下:
def unapply(z: Int): Option[Int] = if (z%2 == 0) Some(z - 2) else None
我从控制台获得的是40
那么,我理解它吗?
答案 0 :(得分:1)
表示
Twice(n)
- >Twice.unapply(n)
- >Twice.unapply(42)
不,Twice(n)
是一种模式(此处;它也可以用作表达式,但具有不同的含义),Twice.unapply(n)
是一个表达式。这是一个在这里毫无意义的表达,因为你还没有n
的价值!而是调用Twice.unapply(x)
。
x match { case Twice(n) => ...expression_using_n; ...other cases }
与
Twice.unapply(x) match {
case Some(n) => ...expression_using_n
case None => x match { ...other cases }
}
或者删除圆形,因为Some
本身就是一个提取器对象:
val unapplied = Twice.unapply(x)
if (unapplied.isDefined) {
val n = unapplied.get
...expression_using_n
} else
x match { ...other cases }