Scala opérateur @
Ce n'Scala opérateur @ faire?
Par exemple, dans le billet de blog Le Langage formel de Traitement en Scala, Partie 2 il y a un quelque chose comme cela
case x @ Some(Nil) => x
Vous devez vous connecter pour publier un commentaire.
Elle permet de lier un motif correspondant à une variable. Considérez les points suivants, par exemple:
Vous pouvez facilement extraire le contenu:
Mais que faire si vous ne voulais pas le contenu de
Some
, mais l'option elle-même? Cela serait accompli avec ceci:Noter que
@
peut être utilisé à tout niveau, et pas seulement au plus haut niveau de l'appariement._*
). Mais peut-être que cela a été précisé sur une nouvelle version de la spécification.@
avecSome(_)
, mais plutôt si vous voulais match sur le contenu de laSome
, mais encore reportez-vous à la lui-même, par exemple,case x @ Some(7) => println(x)
. Comme je l'interprétercase x @ Some(_)
est juste une version plus détaillée decase x: Some
.case x: Some[_]
, ce qui n'est pas moins verbeuxa
de typeAny
et si il est de typeLong
puis retoura.toString
. Cela peut être fait naïvement quedef foo(a:Any) = a match {case l:Long => l.toString}
. Mais je veux que le côté Gauche de=>
retour d'unString
plutôt queLong
, mais seulement sia
est de typeLong
.bar(l)
, pasl
. Pouvons-nous faire le match, de sorte que le membre de droite de=>
abar(l)
de travailler directement plutôt quel
; c'est à dire, labar(l)
est calculée sur la GAUCHE de=>
. Quelque chose commecase l:Long (x@bar(l)) =>
(cela ne fonctionne pas).@
peut être utilisé pour lier un nom à réussi d'un motif correspondant, ou un sous-modèle. Les modèles peuvent être utilisés dans un modèle d'appariement, le côté gauche de la<-
pour des compréhensions, et en déstructurant assignations.Vous permet de faire correspondre le haut-niveau d'un motif. Exemple:
Lorsque le pattern matching
variable @ pattern
lie variable à la valeur compensée par modèle si le modèle correspond. Dans ce cas, cela signifie que la valeur dex
seraSome(Nil)
dans ce cas-clause.Il définit la valeur de
x
le modèle qui correspond. Dans votre exemple,x
serait doncSome(Nil)
(comme vous avez pu le déterminer à partir d'un appel à println)