快学Scala读书笔记之Chapter 14(模式匹配和样例类)

时间:2021-08-18 07:04:54

Scala有一个强大的模式匹配机制可以应用在多种场合:switch语句,类型查询,以及“析构”(获取复杂表达式的不同部分),除此以外Scala还提供了样例类,对模式匹配进行了优化。

要点

  • match表达式是一个很好的switch,不会有意外掉入到下一分支的问题。
  • 如果没有模式能够匹配,会抛出MatchError,可以用case _模式来避免。
  • 模式可以包含一个随意定义的条件,称作守卫。守卫可以是任何Boolean条件
    例如

    ch match {
    case '+' => sign = 1
    case '-' => sign = -1
    case _ if Character.isDigit(ch) => digit = Character.digit(ch, 10)
    case _ => sign = 0
    }
  • 如果case关键字后面跟着一个变量名,那么匹配的表达式会被赋值给这个变量即: case ch => digit = Character.digit(ch, 10)

  • 可以对表达式的类型进行匹配,即: case x: Int => x;
    优先选择模式匹配而不是isInstanceOf/asInstanceOf。匹配类型的时候必须给出一个变量名,否则,将会拿对象本身来进行匹配。匹配发生在运行期,Java虚拟机中泛型的类型信息是被擦掉的,所有不能用类型来匹配特定的Map类型(不懂),例如case m: Map[String, Int] => 是错误的,需要用case m: Map[, ] =>来进行匹配。不过可以匹配Array[Int]
  • 可以匹配数组、元组、和样例类的模式,然后匹配到的不同部分绑定到变量(“析构”)。
    这些功能的背后是提取器机制——带有从对象中提取值得unapply和unapplySeq方法的对象。
  • 在for表达式中,不能匹配的情况会被安静地跳过。
  • 样例类是编译器会为之自动产生模式匹配所需的方法的类。
  • 样例类继承层级中的公共超类应该是sealed(密封)的,密封类的所有子类都必须在与该密封类相同的文件中定义。
  • 用Option来存放对于可能存在也可能不存在的值——比null更安全。