Разница в одноэлементном объекте с круглыми скобками и без сопоставления с образцом? - PullRequest
2 голосов
/ 20 октября 2019

При использовании 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 как нечетное число? Какая разница между четным и четным () в этом сопоставлении с образцом?

1 Ответ

5 голосов
/ 20 октября 2019

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, потому что переменная шаблона находится в первой позиции.

...