2013-12-23 64 views
37

鉴于这种情况Person类:模式匹配`@`符号

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