gpt4 book ai didi

Scala 匹配错误与未应用

转载 作者:行者123 更新时间:2023-12-02 07:06:27 24 4
gpt4 key购买 nike

我正在尝试 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
}

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

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)
}

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

最佳答案

val x = Twice(21)

相同
val x = Twice.apply(21)

意味着 x 将等于 42Twice.unapply(42) 返回一个 Some(21),这意味着 case Twice(21) 成功匹配值 x == 42

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

Twice.unapply(21) 返回None(因为y == 21,也就是说,如果y 是奇数)。每当 unapply 为某个值返回 None 时,我们就说具有该 unapply 方法的提取器对象不匹配那个值。

如果 match 语句没有匹配到它的任何 case 的值,它将抛出一个 MatchError

关于Scala 匹配错误与未应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11190284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com