2013-12-23 3 views
37

Учитывая это Person случай класс:Pattern Matching `@` Symbol

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

... и этот экземпляр

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

Есть ли причина предпочесть этот код (с @)

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

... над следующим?

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

Возможно, мне не хватает значения/силы @?

ответ

74

Включите только @, если вы хотите иметь дело с самим объектом. Следовательно:

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

В противном случае в этом нет реальной точки.

+2

Вы используете точку с запятой для обращения к самому объекту. Интересно, почему точка с запятой не используется повторно для обозначения самого объекта? – Val

+2

@Val: В его коде нет точек с запятой? – cdmckay

+0

Полезно знать! Прежде чем читать этот ответ, я напишу так: «case p: Person, если p! = Bill => p.age' – erdavila