Я пытаюсь воспроизвести пример сильного образца, который Joshua Suereth представил в своем интервью Devoxx 2013 под названием «Как владеть Скалой в окопах». К сожалению, я не могу достичь того, что он описал, и я не могу понять, что не так. Может ли кто-нибудь дать мне подсказку о том, что мне не хватает? (My Scala версия 2.10.3)Почему этот шаблон не работает в Scala?
Пожалуйста, смотрите самодостаточный код ниже:
case class Person(name: String, residence: Seq[Residence])
case class Residence(city: String, country: String)
object LivesIn {
def unapply(p: Person): Option[Seq[String]] =
Some(
for(r <- p.residence)
yield r.city
)
}
class StringSeqContains(value: String) {
def unapply(in: Seq[String]): Boolean =
in contains value
}
object PatternPower extends App {
val people =
Seq(Person("Emre", Seq(Residence("Antwerp", "BE"))),
Person("Ergin", Seq(Residence("Istanbul", "TR"))))
val Istanbul = new StringSeqContains("Istanbul")
// #1 does not work as expected, WHY?
println(
people collect {
case person @ LivesIn(Istanbul) => person
}
)
// #2 works as expected
println(
people collect {
case person @ LivesIn(cities) if cities.contains("Istanbul") => person
}
)
// #3 works as expected
println(
people collect {
case person @ Person(_, res) if res.contains(Residence("Istanbul", "TR")) => person
}
)
}
Когда я скомпилировать и запустить его я получаю:
List()
List(Person(Ergin,List(Residence(Istanbul,TR))))
List(Person(Ergin,List(Residence(Istanbul,TR))))
Как обозначен в исходном коде , Я не понимаю, почему первый шаблон не дает того же результата, что и остальные два шаблона. Любые идеи почему?
, вы можете заполнить отчет об ошибке. –
не уверен, если это ошибка, позвольте мне проверить с людьми на [scala-user] (https://groups.google.com/forum/#!forum/scala-user). –
Это не ошибка. Без круглых скобок критерием соответствия является равенство со стабильным значением, которое является референтом указанного имени. –