中国领先的IT技术网站
|
|

学习Scala中的Case类

本文介绍Scala中Case类的一些使用心得。

作者:Regular 译来源:Regular|2009-07-08 15:35


51CTO编辑推荐:Scala编程语言专题

Scala支持case类的概念。case类也是正规的类,暴露其构造器参数,并通过模式匹配提供递归解构机制。 以下是由抽象超类Term和三个具体case类Var,Fun,和App组成的类层次的例子。

  1. abstract class Term  
  2. case class Var(name: String) extends Term  
  3. case class Fun(arg: String, body: Term) extends Term  
  4. case class App(f: Term, v: Term) extends Term 

这个类层次可以用来表现无类型lambda算子。为了便于case类实例的构建,Scala不需要使用new原语。只要简单地把类名用作函数即可。举例如下:

  1. Fun("x", Fun("y", App(Var("x"), Var("y"))))  

case类的构造器参数被当作公开值并可以直接被访问。

  1. val x = Var("x")  
  2. Console.println(x.name) 

对于每个case类,Scala编译器将产生实现了结构相等性检查的equals方法和一个toString方法。举例如下:

  1. val x1 = Var("x")  
  2. val x2 = Var("x")  
  3. val y1 = Var("y")  
  4. println("" + x1 + " == " + x2 + " => " + (x1 == x2))  
  5. println("" + x1 + " == " + y1 + " => " + (x1 == y1)) 

将打印

  1. Var(x) == Var(x) => true 
  2. Var(x) == Var(y) => false 

只有在分解数据结构的时候用到了模式匹配的情况下,定义case类才是有意义的。以下的对象为我们的lambda算子的展示定义了漂亮的打印函数:

  1. object TermTest extends Application {  
  2.   def printTerm(term: Term) {  
  3.     term match {  
  4.       case Var(n) =>  
  5.         print(n)  
  6.       case Fun(x, b) =>  
  7.         print("^" + x + ".")  
  8.         printTerm(b)  
  9.       case App(f, v) =>  
  10.         Console.print("(")  
  11.         printTerm(f)  
  12.         print(" ")  
  13.         printTerm(v)  
  14.         print(")")  
  15.     }  
  16.   }  
  17.   def isIdentityFun(term: Term): Boolean = term match {  
  18.     case Fun(x, Var(y)) if x == y => true 
  19.     case _ => false 
  20.   }  
  21.   val id = Fun("x", Var("x"))  
  22.   val t = Fun("x", Fun("y", App(Var("x"), Var("y"))))  
  23.   printTerm(t)  
  24.   println  
  25.   println(isIdentityFun(id))  
  26.   println(isIdentityFun(t))  

我们的例子里,函数print表达为开始于match关键字的,由一系列的case Pattern => Body子句组成的模式匹配语句。

上面的程序还定义了函数isIdentityFun,用来检查是否给定的term对应于一个简单的身份函数。这个例子使用了深度模式和护卫语句。在使用给定值匹配了模式之后,护卫语句(定义于关键字if之后)被执行评估。如果返回true,匹配成功;反之,则匹配失败,并尝试下一个模式。

原文来源:Scala官方网站

【相关阅读】

  1. Groovy创始人:Java面临终结 Scala将取而代之
  2. Scala的类型系统:取代复杂的通配符
  3. Scala的类型系统 比Java更灵活
  4. Java程序员,你为什么要关注Scala
  5. Scala编程语言
【责任编辑:杨赛 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Linux编程技术详解

本书全面介绍了Linux编程相关的知识,内容涵盖Linux基本知识、如何建立Linux开发环境、Linux开发工具、Linux文件系统、文件I/O操作、设备文...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× 学习达标赢Beats耳机