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

phi*_*eas 2 functional-programming scala pattern-matching

在使用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"
Run Code Online (Sandbox Code Playgroud)

n = 9作为奇数如何满足偶数情况?这种模式匹配内的even和even()之间有什么区别?

Mar*_*lic 5

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")
       ^
Run Code Online (Sandbox Code Playgroud)

您刚巧给它起了相同的名字,但是您可以写

n match {
  case foo => println("Is even")
  ...
}
Run Code Online (Sandbox Code Playgroud)

Is even由于可变图案位于第一个位置,因此仍会打印出来。