Scala中Case的使用

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值