Weź następującą funkcję:
def fMatch(s: String) = {
s match {
case "a" => println("It was a")
case _ => println("It was something else")
}
}
Ten wzór ładnie pasuje:
scala> fMatch("a")
It was a
scala> fMatch("b")
It was something else
Chciałbym móc wykonać następujące czynności:
def mMatch(s: String) = {
val target: String = "a"
s match {
case target => println("It was" + target)
case _ => println("It was something else")
}
}
Powoduje to następujący błąd:
fMatch: (s: String)Unit
<console>:12: error: unreachable code
case _ => println("It was something else")
Wydaje mi się, że dzieje się tak, ponieważ uważa, że cel jest w rzeczywistości nazwą, którą chcesz przypisać do tego, co jest na wejściu. Dwa pytania:
Dlaczego to zachowanie? Czy nie można po prostu poszukać istniejących zmiennych w zakresie, które mają odpowiedni typ i użyć ich najpierw, a jeśli nie zostaną znalezione, potraktować cel jako nazwę do dopasowania do wzorca?
Czy istnieje obejście tego problemu? Jakiś sposób na dopasowanie wzorca do zmiennych? Ostatecznie można by użyć dużego stwierdzenia if, ale opakowanie zapałek jest bardziej eleganckie.