O que o operador @ do Scala faz?
Por exemplo, na postagem do blog Formal Language Processing in Scala, Part 2, existe algo parecido com isto
case x @ Some(Nil) => x
O que o operador @ do Scala faz?
Por exemplo, na postagem do blog Formal Language Processing in Scala, Part 2, existe algo parecido com isto
case x @ Some(Nil) => x
Ele permite vincular um padrão correspondente a uma variável. Considere o seguinte, por exemplo:
val o: Option[Int] = Some(2)
Você pode extrair facilmente o conteúdo:
o match {
case Some(x) => println(x)
case None =>
}
Mas e se você não quisesse o conteúdo de Some
, mas a opção em si? Isso seria realizado com isso:
o match {
case x @ Some(_) => println(x)
case None =>
}
Observe que @
pode ser usado em qualquer nível, não apenas no nível superior da correspondência.
_*
). Mas talvez isso tenha sido esclarecido em uma versão mais recente da especificação.@
comSome(_)
, mas se quiser corresponder ao conteúdo doSome
, mas ainda se referir ao próprio, por exemplocase x @ Some(7) => println(x)
. Na minha interpretação,case x @ Some(_)
é apenas uma versão mais detalhada docase x: Some
.case x: Some
não funciona por si só. Você tem que usarcase x: Some[_]
, o que não é menos detalhado@
pode ser usado para vincular um nome a um padrão ou subpadrão correspondido com êxito. Os padrões podem ser usados na correspondência de padrões, no lado esquerdo da entrada<-
para compreensão e na atribuição de desestruturações.fonte
Quando a correspondência de padrões
variable @ pattern
liga a variável ao valor correspondente ao padrão, se o padrão corresponder. Nesse caso, isso significa que o valor dex
estaráSome(Nil)
nessa cláusula de caso.fonte
Permite corresponder ao nível superior de um padrão. Exemplo:
fonte
Ele define o valor de
x
para o padrão que corresponde. No seu exemplo,x
seria , portanto,Some(Nil)
(como você pode determinar a partir de uma chamada para println )fonte