¿Qué hace el operador Scala's @?
Por ejemplo, en la publicación de blog Procesamiento de lenguaje formal en Scala, Parte 2, hay algo como esto
case x @ Some(Nil) => x
¿Qué hace el operador Scala's @?
Por ejemplo, en la publicación de blog Procesamiento de lenguaje formal en Scala, Parte 2, hay algo como esto
case x @ Some(Nil) => x
Le permite a uno vincular un patrón coincidente a una variable. Considere lo siguiente, por ejemplo:
val o: Option[Int] = Some(2)
Puede extraer fácilmente el contenido:
o match {
case Some(x) => println(x)
case None =>
}
Pero lo que si usted quiere no es el contenido de Some
, pero la opción de sí misma? Eso se lograría con esto:
o match {
case x @ Some(_) => println(x)
case None =>
}
Tenga en cuenta que @
se puede usar en cualquier nivel, no solo en el nivel superior de la coincidencia.
_*
). Pero tal vez esto se ha aclarado en una versión más nueva de la especificación.@
conSome(_)
, sino más bien si desea hacer coincidir el contenido de laSome
, pero aún se refiere a Some en sí, por ejemplocase x @ Some(7) => println(x)
. Según lo interpreto,case x @ Some(_)
es solo una versión más detallada decase x: Some
.case x: Some
no funciona por sí solo. Tienes que usarcase x: Some[_]
, que no es menos detallado@
se puede usar para vincular un nombre a un patrón o subpatrón que coincida correctamente Los patrones se pueden usar en la coincidencia de patrones, el lado izquierdo de la entrada<-
para comprender y en tareas de desestructuración.fuente
Cuando la coincidencia de patrones
variable @ pattern
vincula la variable al valor que coincide con el patrón si el patrón coincide. En este caso, eso significa que el valor dex
estaráSome(Nil)
en esa cláusula de caso.fuente
Le permite hacer coincidir el nivel superior de un patrón. Ejemplo:
fuente
Establece el valor de
x
al patrón que coincide. Porx
lo tanto , en su ejemplo, seríaSome(Nil)
(como podría determinar a partir de una llamada a println )fuente