Operatore Scala @

Cosa fa l’operatore di Scala @?

Ad esempio, nel post del blog Formal Language Processing in Scala, Parte 2 c’è qualcosa di simile

case x @ Some(Nil) => x 

Permette di associare un modello abbinato a una variabile. Si consideri quanto segue, ad esempio:

 val o: Option[Int] = Some(2) 

Puoi facilmente estrarre il contenuto:

 o match { case Some(x) => println(x) case None => } 

Ma cosa succede se non si desidera il contenuto di Some , ma l’opzione stessa? Ciò sarebbe realizzato con questo:

 o match { case x @ Some(_) => println(x) case None => } 

Nota che @ può essere utilizzato a qualsiasi livello, non solo al livello più alto della corrispondenza.

@ può essere usato per associare un nome a un modello o una sottotest corretta. I pattern possono essere usati nella corrispondenza dei pattern, nella parte sinistra di <- in per le comprensioni e negli assetti di destrutturazione.

 scala> val [email protected]([email protected](a), Some(b)) = (Some(1), Some(2)) d: (Some[Int], Some[Int]) = (Some(1),Some(2)) c: Some[Int] = Some(1) a: Int = 1 b: Int = 2 scala> (Some(1), Some(2)) match { case [email protected]([email protected](a), Some(b)) => println(a, b, c, d) } (1,2,Some(1),(Some(1),Some(2))) scala> for ([email protected](y) <- Seq(None, Some(1))) println(x, y) (Some(1),1) scala> val List(x, xs @ _*) = List(1, 2, 3) x: Int = 1 xs: Seq[Int] = List(2, 3) 

Quando la corrispondenza del pattern variable @ pattern alla variabile associa la variabile al valore corrispondente dal pattern se il pattern corrisponde. In questo caso ciò significa che il valore di x sarà Some(Nil) in tale clausola.

Ti permette di abbinare il livello superiore di un modello. Esempio:

 case x @ "three" => assert(x.equals("three")) case x @ Some("three") => assert(x.get.equals("three"))) case x @ List("one", "two", "three") => for (element <- x) { println(element) } 

Imposta il valore di x nel modello che corrisponde. Nel tuo esempio, x sarebbe quindi Some(Nil) (come potresti determinare da una chiamata a println )