学习Scala中的Case类

开发 后端
本文介绍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. Groovy创始人:Java面临终结 Scala将取而代之
  2. Scala的类型系统:取代复杂的通配符
  3. Scala的类型系统 比Java更灵活
  4. Java程序员,你为什么要关注Scala
  5. Scala编程语言
责任编辑:yangsai 来源: Regular
相关推荐

2009-07-21 11:25:03

ScalaRational类

2009-07-22 07:53:00

Scala扩展类

2009-07-20 16:56:51

Scala类的定义

2009-06-19 11:13:47

Scalacase类模式匹配

2009-09-28 11:37:03

Journal.scaKestrel

2009-11-16 17:04:46

Inside Scal

2009-07-21 16:58:31

Scala变量范围

2009-07-22 07:43:00

Scala闭包

2009-06-16 17:54:38

Scala类语法语义

2009-06-19 13:16:36

Scala计算器解析器组合子

2009-07-22 07:50:00

Scala二维布局库抽象类

2009-07-22 09:31:59

Scala类类层级Java类

2009-09-09 11:37:08

Scala的模式匹配

2009-07-21 08:54:35

Scala富包装器

2009-07-22 07:57:00

ScalaCurry化函数

2009-07-22 08:45:35

Scala超类构造器override修饰符

2009-06-08 21:45:46

Javaswitch-case

2009-08-03 11:07:18

Scala Actor

2009-07-22 09:22:20

Scala工厂对象

2009-09-22 10:15:42

PersistentQScala
点赞
收藏

51CTO技术栈公众号