Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pattern Matching `@` Symbol

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 @?

like image 275
Kevin Meredith Avatar asked Dec 23 '13 18:12

Kevin Meredith


People also ask

What are pattern matching characters?

The simplest and very common pattern matching character operators is the . This simply allows for any single character to match where a . is placed in a regular expression. For example /b.t/ can match to bat, bit, but or anything like bbt, bct .... Square brackets ( [..] )

What is in pattern matching?

Pattern matching in computer science is the checking and locating of specific sequences of data of some pattern among raw data or a sequence of tokens. Unlike pattern recognition, the match has to be exact in the case of pattern matching.

What is pattern matching in Scala?

Pattern matching is a mechanism for checking a value against a pattern. A successful match can also deconstruct a value into its constituent parts. It is a more powerful version of the switch statement in Java and it can likewise be used in place of a series of if/else statements.


2 Answers

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.

like image 178
wheaties Avatar answered Sep 19 '22 17:09

wheaties


Regarding the comments for the above answer.

Consider this case class.

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

while doing pattern matching.

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** 
like image 40
Praveen L Avatar answered Sep 20 '22 17:09

Praveen L