0

我对提取器及其使用感到困惑。我阅读了 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

那么,我理解对了吗?

4

1 回答 1

1

这意味着Twice(n)--> Twice.unapply(n)-->Twice.unapply(42)

不,Twice(n)是一个模式(在这里;它也可以用作表达式,但含义不同),并且Twice.unapply(n)是一个表达式。这是一个在这里没有意义的表达,因为你还没有价值nTwice.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 }
于 2016-04-26T08:56:16.853 回答