Toma la siguiente función:
def fMatch(s: String) = {
s match {
case "a" => println("It was a")
case _ => println("It was something else")
}
}
Este patrón combina muy bien:
scala> fMatch("a")
It was a
scala> fMatch("b")
It was something else
Lo que me gustaría poder hacer es lo siguiente:
def mMatch(s: String) = {
val target: String = "a"
s match {
case target => println("It was" + target)
case _ => println("It was something else")
}
}
Esto emite el siguiente error:
fMatch: (s: String)Unit
<console>:12: error: unreachable code
case _ => println("It was something else")
Supongo que esto se debe a que cree que target es en realidad un nombre que le gustaría asignar a cualquier entrada. Dos preguntas:
¿Por qué este comportamiento? ¿No puede el caso simplemente buscar las variables existentes en el alcance que tengan el tipo apropiado y usarlas primero y, si no se encuentra ninguna, luego tratar el objetivo como un nombre para hacer coincidir el patrón?
¿Hay una solución para esto? ¿Alguna forma de hacer coincidir el patrón con las variables? En última instancia, uno podría usar una gran declaración if, pero el caso de coincidencia es más elegante.
scala
pattern-matching
match
Henry Henrinson
fuente
fuente
Respuestas:
Lo que busca es un identificador estable . En Scala, estos deben comenzar con una letra mayúscula o estar rodeados de comillas invertidas.
Ambos serían soluciones a su problema:
Para evitar referirse accidentalmente a variables que ya existían en el ámbito adjunto, creo que tiene sentido que el comportamiento predeterminado sea que los patrones en minúsculas sean variables y no identificadores estables. Solo cuando vea algo que comience con mayúsculas o con tics posteriores, debe tener en cuenta que proviene del alcance circundante.
fuente
target
es un valor (val
) y no una variable (var
). No funciona con variables.Nil
, y apuesto a que es la verdadera razón.this
como un identificador estable para un patrón de coincidencia con él, la única forma parece ser usar un protector de igualdad comocase x if x == this =>
. Probablemente una limitación sintáctica, de lo contrario debería funcionar semánticamente al menos dentro deobject
s.