带括号的单例对象和不带模式匹配的单例对象有何区别?



使用even()时,它是否仅与unapply的真实条件匹配,并且在使用even时,这如何仍然打印"Is even"

object even{
def unapply(arg: Int): Boolean = (arg%2 == 0)
}
object singleDigit{
def unapply(arg: Int): Option[Boolean] = {
if(arg < 10) Some(true)
else None
}
}
val n = 9
n match {
case even() => println("Is even")
case singleDigit => println("is single")
case _ => println("No property")
}
//This gives "is single" 
n match {
case even => println("Is even")
case singleDigit => println("is single")
case _ => println("No property")
}
//This gives "Is even"

偶数如何满足这里 n=9 作为奇数? 在这个模式匹配中,偶数和偶数((有什么区别?

case even =>实际上是一种变量模式,并不是指编译器警告所暗示的even.unapply

Warning:(19, 9) patterns after a variable pattern cannot match (SLS 8.1.1)
If you intended to match against object even in class A$A3, you must use backticks, like: case `even` =>
case even => println("Is even")
^

你只是碰巧给它起了同样的名字,但你可以写

n match {
case foo => println("Is even")
...
}

它仍然会打印出Is even因为可变图案位于第一个位置。

最新更新