Этот вопрос ранее был задан в scala -случающем списке рассылки без подтвержденного ответа.
scala> val T = new Pair(1, 2){
override def equals(obj:Any) = obj.isInstanceOf[(Int, Int)] && obj.asInstanceOf[(Int, Int)]._1 == this._1}
}
T: (Int, Int) = (1,2)
scala> T match {
case (1, 1) => println("matched")
case _ => println("not matched")
}
not matched
scala> (1, 1) match {
case T => println("matched")
case _ => println("not matched")
}
not matched
scala> T == (1, 1)
res15: Boolean = true
Я думал, что результат согласования с константой (val) зависит от возвращаемого значения "equals", но результаты показывают, что это не так, тогда каковы критерии?
Кто-то предположил, что case (1, 1) =>
является шаблоном экстрактора и вместо этого использует Tuple2.unapply
. поэтому я пробовал:
scala> Pair.unapply(T)
res1: Option[(Int, Int)] = Some((1,2))
scala> Pair.unapply(T).get == (1, 1)
res2: Boolean = true
Может кто-нибудь объяснить, почему ==
получить правду, но я не могу заставить их соответствовать?