模式匹配“@”符号

根据 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

也许我错过了 @的意义/力量?

21310 次浏览

只有当你想同时处理对象本身时才包含 @,因此:

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

否则,就没必要把它包括在内了。

关于上述答案的评论。

考虑一下这个案例类。

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

在做模式匹配的时候。

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**