案例类提取器

一个情况下类是与很多标准样板代码自动包含的类。这样做的一个好处是 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