Scala By Example: Case 类与模式匹配

第七章的开头罗嗦了好长一段来说明没有 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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值