he encontrado que cuando se utiliza la coincidencia de patrones con alternativas (por cadenas), Scala acepta las variables a partir de caso superior (en el ejemplo siguiente, MyValue1
y MyValue2
), pero no los que empiezan con el caso inferior (myValue1
, myValue2
). ¿Es esto un error o una característica de Scala? Lo entiendo en la versión 2.8. Si esta es una característica, ¿alguien puede explicar la razón detrás de esto? Este es el código que utilicé:patrón Scala a juego con nombre de la variable en minúsculas
val myValue1 = "hello"
val myValue2 = "world"
val MyValue1 = "hello"
val MyValue2 = "world"
var x:String = "test"
x match {
case MyValue1 | MyValue2 => println ("first match")
case myValue1 | myValue2 => println ("second match")
}
corriendo, me sale el siguiente:
scala> val myValue1 = "hello"
myValue1: java.lang.String = hello
scala> val myValue2 = "world"
myValue2: java.lang.String = world
scala> val MyValue1 = "hello"
MyValue1: java.lang.String = hello
scala> val MyValue2 = "world"
MyValue2: java.lang.String = world
scala> var x:String = "test"
x: String = test
scala> x match {
| case MyValue1 | MyValue2 => println ("first match")
| case myValue1 | myValue2 => println ("second match")
| }
<console>:11: error: illegal variable in pattern alternative
case myValue1 | myValue2 => println ("second match")
^
<console>:11: error: illegal variable in pattern alternative
case myValue1 | myValue2 => println ("second match")
^
EDITAR:
Por lo tanto, es de hecho una característica y no un error ... ¿Alguien puede dar un ejemplo cuando esto podría ser útil?
Cuando uso:
x match {
case myValue1 => println ("match")
case _ =>
}
me sale un aviso unreachable code
en el último caso, lo que implica que el primero siempre coincide.
Este es uno de los errores comunes de programación en Scala: http://stackoverflow.com/questions/1332574/common- programación-errors-for-scala-developers-to-avoid/2489355 # 2489355. Recomiendo leer todo el hilo, tiene un montón de otros problemas como este. – Steve
Gracias por la gran referencia. – Jus12
Un ejemplo útil: 'x match {case myValue1: String => println (" match: "+ myValue1); case _ =>} '-> myValue1 se convierte en una variable local. – Madoc