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

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更安全。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值