Scala By Example: Case 类与模式匹配

    技术2022-05-20  32

    第七章的开头罗嗦了好长一段来说明没有 case class 的生活(还包括没有OO的生活)是多么的悲惨,我们则直接来看看 Case Class 的特点:

    1: class NonCase(i: Int) 2: case class Case(i: Int) 3:  4: val nc = new NonCase(12) 5: val nc2 = new NonCase(12) 6: // val nce = NonCase(12) //error: not found: value NonCase 7: println(nc) 8: println(nc == nc2) // false 9: //you can't access i unless use val or var: 'class NonCase(val i: Int) 10: // println(nc.i) //error: value i is not a member of this.NonCase 11:  12: val c = new Case(12) 13: // Case class implicitly come with a constructor function, with the same name 14: // as the class 15: val c2 = Case(12) 16: // Case class & objects implicitly come with implementatin of methods toString 17: // equals and hashCode 18: println(c) // Case(12) 19: println(c == c2) // true 20: // Case class implicitly come with nullary accessor methods which retrieve the 21: // constructor arguments 22: println(c.i) // 12

    以上这段代码比较了两个几乎一样的类,唯一的区别在于 case 修饰符。可以看到,Case 类预先实现了 toString, equals 等常用函数,调用起来极为方便。但 Case 的魔力不止如此,除了这些语法糖外,Case 还提供了强大的模式匹配功能。

    Scala 的根类 Any 中实现了标准方法 match。match 可以对以下类型的参数进行处理:

    Case class 构造器(constructor)模式变量(必须以小写字母开头,以区别常量)通配符 _字面量常量(必须以大写开头。强制的命名风格:当命名风格、缩进被放到语法中时,你是不是想起了 Python 的空格和 Go 的 public/private)

    如果全部 case 项都没有匹配到,则抛出 MatchError 异常。

    在实际使用的时候,我们往往会省略 match 而使用简化的书写方式:模式匹配匿名函数(Pattern Matching Anonymous Functions)

    { case P1 => E1 ... case Pn => En } 等同于 (x => x match { case P1 => E1 ... case Pn => En })

    练习 1:用 case 来实现二叉树的 insert / contains (原书是有 match 的例程的,不过一来在 Actor 一章已经领教过,二来上下文太长而且没什么味道,所以还是直接上练习题吧。)

    PS. 虽然今天的笔记异常的短,但是就目前我看到的 Scala 特性而言,Case 无疑是 Scala 中第三重要/常用的特性了(第一是 Actor;第二是函数风格;第四是 Trait;第五是 XML;第六是单例和伴生对象。个人排序,算法可能和你不同啊)

    PS II. 最近逼迫自己不断得学新把戏,很累,也很兴奋,我想是时候停个把小时写个感悟什么的了。

    PS III. 语法高亮的王道还是 SyntaxHighlighter,但对于天天都在写代码的我而言,我实在不愿意在使用 Live Writer 的时候还要去写HTML标记,所以,还是拿 Code Snippet 凑活吧,虽然除了注释啥都高亮不起来

    Technorati 标签: Scala

    最新回复(0)