personalizacion - En la coincidencia de patrones scala, ¿qué es el sombreado sospechoso por un patrón variable?
escala hatch autocad (3)
Cuando escribo el siguiente código en Intellij, resalta la x dentro de la coincidencia con la advertencia "Sombreado sospechoso por un patrón variable"
val x = "some value"
"test" match {
case x =>
}
Sugiere que lo cambie a:
val x = "some value"
"test" match {
case `x` => //note backticks
}
¿Qué es un seguimiento sospechoso y qué hacen los backticks?
El caso dentro del partido genera un nuevo símbolo x
para recibir el valor coincidente. Esto se debe a que, por convención, se espera que los identificadores de minúsculas se refieran a los valores y los identificadores de mayúsculas a los tipos.
Entonces la declaración de caso genera un nuevo símbolo del mismo nombre x
como su valor inicial, "sombreando" ese valor original. Al "sombrear" IntelliJ significa que oculta cualquier otro valor del mismo nombre y, por lo tanto, los hace inaccesibles.
Señala esto como sospechoso porque este sombreado es a menudo inadvertido, como parece ser el caso en su ejemplo.
Con respecto a los backticks, ver, por ejemplo, aquí: Necesito una aclaración sobre los identificadores literales de Scala (backticks) . Sin embargo, en realidad no parecen una buena solución. Mejor elegir un nombre diferente.
Un extracto de la programación en Scala [1]:
Un identificador literal es una cadena arbitraria encerrada en ticks hacia atrás
(`...`)
. Algunos ejemplos de identificadores literales son:
`x` `<clinit>` `yield`
La idea es que puede poner cualquier cadena que sea aceptada por el tiempo de ejecución como un identificador entre las marcas de retroceso. El resultado es siempre un identificador de Scala. Esto funciona incluso si el nombre que figura en las marcas de retroceso sería una palabra reservada de Scala. Un caso de uso típico es acceder al método de
yield
estático en la claseThread
de Java. No puede escribirThread.yield()
porqueyield
es una palabra reservada en Scala. Sin embargo, puede seguirThread.`yield`()
el método en ticks posteriores, por ejemplo,Thread.`yield`()
.
En resumen, con `x`
se está `x`
con el valor de x
. Con x
, está creando una nueva variable que coincidirá con cualquier cosa y guardará el resultado en x
.
[1] M. Odersky, L. Spoon, B. Venners, Programación en Scala , 2da edición, Walnut Creek: Artima Press 2010, pág. 109 http://www.artima.com/pins1ed/functional-objects.html#i1517246665-1
case x
crea una variable llamada x
, que coincidiría con todo y, como ya existe una variable con el mismo nombre, la sombreará utilizando el mismo nombre.
case `x`
usa el valor de la variable x
que se declaró anteriormente y solo haría coincidir las entradas con los mismos valores.
PD
Puede dejar las marcas traseras si el nombre de la variable está en mayúscula como en
case Pi