web-dev-qa-db-fra.com

Correspondance de motif `@` Symbole

Compte tenu de cette classe de cas Person:

scala> case class Person(name: String, age: Int) {}
defined class Person

... et cette instance

scala> val b = Person("Kevin", 100)
b: Person = Person(Kevin,100)

Y a-t-il une raison de préférer ce code (avec @)

scala> b match {
     |    case p @ Person(_, age) => println("age")
     |    case _ => println("none")
     | }
age

... sur ce qui suit?

scala> b match {
     |    case Person(_, age) => println("age")
     |    case _ => println("none")
     | }
age

Peut-être que je manque le sens/le pouvoir de @?

54
Kevin Meredith

Vous incluez uniquement le @ lorsque vous souhaitez également traiter l'objet lui-même. Par conséquent:

that match{
  case p @ Person(_, age) if p != bill => age
  case Person(_, age) => age - 15
  case _ => println("Not a person")
}

Sinon, il ne sert à rien de l'inclure.

91
wheaties

Concernant les commentaires pour la réponse ci-dessus.

Considérez cette classe de cas.

case class Employee(name: String, id: Int, technology: String)

tout en faisant correspondre les motifs.

case e @ Employee(_, _, "scala") => e.name // matching for employees with only scala technology ... it works

case x: Employee => x.name // It also works

case e: Employee(_, _, "scala") => e.name // matching for employees with only scala technology ... **wont't work**
7
Praveen L