Pattern Matching `@` Symbol

Kevin Meredith picture Kevin Meredith · Dec 23, 2013 · Viewed 16.3k times · Source

Given this Person case class:

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

... and this instance

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

Is there a reason to prefer this code (with @)

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

... over the following?

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

Perhaps I'm missing the meaning/power of @?

Answer

wheaties picture wheaties · Dec 23, 2013

You only include the @ when you want to also deal with the object itself. Hence:

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

Otherwise, there's no real point in including it.