为什么链式模式匹配结构不可能?例如,以下是合法的,如果是荒谬的,
val a = ADT(5)
val b = a match {
case ADT(a) if a > 4 => ADT(a * 3)
case ADT(a) => ADT(a + 1)
}
b match {
case ADT(a) if a > 13 => doSomething(a)
case _ => {}
}
但以下不是:
a match {
case ADT(a) if a > 4 => ADT(a * 3)
case ADT(a) => ADT(a + 1)
} match {
case ADT(a) if a > 13 => doSomething(a)
case _ => {}
}
我怀疑这是因为我不应该首先这样做,但原则上我不明白为什么它不合法。
答案 0 :(得分:6)
是的,它应该有效,因为(几乎)Scala中的所有内容都是一个表达式,每个表达式都可以用作模式匹配。
在这种情况下,模式匹配是一个表达式,因此它可以被另一个“链式”模式匹配使用。但编译器不喜欢它。
给编译器一些带括号的提示有助于:
case class ADT(value: Int)
val a = ADT(5)
(a match {
case ADT(a) if a > 4 => ADT(a * 3)
case ADT(a) => ADT(a + 1)
}) match {
case ADT(a) if a > 13 => println(a)
case _ => {}
}
答案 1 :(得分:3)
你的直觉是正确的;这不是废话 - 通常你 能够以这种方式链接中缀运算符,没有括号(正如其他用户所建议的那样)。实际上,match
曾经作为一种方法实现 - 并且作为一个中缀运算符(默认情况下是左关联) - 所以你的替代语法就可以了。但是,在Scala 2.5中,match
被设为特殊的语言结构而不是方法。不幸的是,我不知道为什么会这样做,但这就是原因:match
不是一个中缀运算符,尽管看起来如此。