案例類提取器

一個情況下類是與很多標準樣板程式碼自動包含的類。這樣做的一個好處是 Scala 可以很容易地將提取器與 case 類一起使用。

case class Person(name: String, age: Int)  // Define the case class
val p = Person("Paola", 42)  // Instantiate a value with the case class type

val Person(n, a) = p  // Extract values n and a
// n: String = Paola
// a: Int = 42

在這個時刻,na 都是程式中的 vals,可以這樣訪問:據說它們是從 p 中提取的。繼續:

val p2 = Person("Angela", 1337)

val List(Person(n1, a1), Person(_, a2)) = List(p, p2)
// n1: String = Paola
// a1: Int = 42
// a2: Int = 1337

在這裡我們看到兩件重要的事情

  • 提取可以在深層級別進行:可以提取巢狀物件的屬性。
  • 並非所有元素都需要提取。萬用字元 _ 字元表示該特定值可以是任何值,並被忽略。沒有建立 val

特別是,這可以輕鬆匹配集合:

val ls = List(p1, p2, p3)  // List of Person objects
ls.map(person => person match {
  case Person(n, a) => println("%s is %d years old".format(n, a))
})

在這裡,我們有程式碼使用提取器來明確檢查 person 是一個 Person 物件並立即拉出我們關心的變數:na