Scala匹配错误与unapply

Jas*_*ond 2 scala pattern-matching unapply

我正在尝试http://www.scala-lang.org/node/112上的代码,我得到一个匹配错误,看起来不应该抛出一个.

这是原始代码:

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 Application {
  val x = Twice(21)
  x match { case Twice(n) => Console.println(n) } // prints 21
}
Run Code Online (Sandbox Code Playgroud)

我刚刚添加了几行来测试当我传递奇数时会发生什么:

object TwiceTest extends Application {
  val x = Twice(21)
  x match { case Twice(n) => Console.println(n) } // prints 21
  val y = 21
  y match { case Twice(n) => Console.println(n) } // throws scala.MatchError: 21 (of class java.lang.Integer)
}
Run Code Online (Sandbox Code Playgroud)

对于21或任何奇数的情况,也应该由对象中的unapply方法处理,据我所知.有人可以解释为什么不是这样吗?

axe*_*l22 6

val x = Twice(21)
Run Code Online (Sandbox Code Playgroud)

是相同的

val x = Twice.apply(21)
Run Code Online (Sandbox Code Playgroud)

意思x是等于42.的Twice.unapply(42)回报Some(21),这意味着case Twice(21)成功的值相匹配x == 42.

这就是第一个match语句打印出来的原因21.

Twice.unapply(21)回报率None(因为y == 21,也就是说,如果y是奇数).每当unapply返回None某个值时,我们都会说使用该unapply方法的提取器对象与该值不匹配.

如果一个match语句与其任何一个案例的值不匹配,它将抛出一个MatchError.