web-dev-qa-db-ja.com

パターンマッチング `@`シンボル

この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

おそらく私は@の意味/力が欠けているのでしょうか?

54
Kevin Meredith

オブジェクト自体も処理する場合は、@のみを含めます。したがって:

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

そうでなければ、それを含めることには実質的な意味はありません。

91
wheaties

上記の答えに対するコメントについて。

このケースクラスを検討してください。

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