案例類提取器
一個情況下類是與很多標準樣板程式碼自動包含的類。這樣做的一個好處是 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
在這個時刻,n
和 a
都是程式中的 val
s,可以這樣訪問:據說它們是從 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
物件並立即拉出我們關心的變數:n
和 a
。