使用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
因为可变图案位于第一个位置。