添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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))
  27. }

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

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

原文来源: Scala官方网站

51CTO编辑推荐:Scala编程语言专题Scala支持case类的概念。case类也是正规的类,暴露其构造器参数,并通过模式匹配提供递归解构机制。 以下是由抽象超类Term和三个具体case类Var,Fun,和App组成的类层次的例子。abstract class Term  case class Var(name: String) extends Term  case class Fu
case 执行方式:逐一判断每个 WHEN 子句直到返回真值为止。此外,没有能够返回真值的WHEN 子句时,也会返回 ELSE 子句指定的表达式。 用法一:在返回映射时 使用 (固定字段展示内容) select case '数据库字段' when '条件1' then '满足条件的结果1' when '条件2' then '满足条件的结果2' else '所有条件之外的结果n' end as '字段名称'
Scala 提供了比java,c更加强大的switch语句——match,而且不用担心因为忘记写break语句而发生 case 穿透 1.更好的switch 与if,类似match也是表达式,如下一个用于匹配字符的函数def charMatch(c: Char) = c match { case '+' => 1 case '-' => -1
Scala 的match表达式类似于其他语言 的switch语句,它可以提供给你在多个备选项 做选择。基本上match表达式可以让你 使用 任意的模式(pattern)做选择。 1. 按值匹配 def valueMatch(fruit: String) { fruit match { case "apple" => print("apple") case "b...
Scala 的try catch和Java 的try catch类似,可以捕捉异常并进行处理。 Scala 可以 使用 模式匹配来匹配不同类型的异常。 在 Scala ,try catch语句可以采用如下形式: try { // 可能抛出异常的代码 } catch { case e: Exception1 => // 处理 Exception1 异常 case e: Exception2 => // 处理 Exception2 异常 } finally { // 处理最终的收尾工作,比如关闭文件、释放资源等 在catch子句块 ,可以 使用 模式匹配来对不同类型的异常进行处理。而finally块 的代码总是会在try或catch 的代码执行完毕后被执行,无论有没有发生异常。 使用 try catch语句的一个例子如下: try { // 可能抛出异常的代码 val result = 10/0 } catch { case e: ArithmeticException => println("发生算术异常:" + e.getMessage()) case e: Exception => println("发生其他异常:" + e.getMessage()) } finally { println("执行完毕") 在这个例子 ,当运行到 `val result = 10/0` 这一行时,由于除数为0,会抛出一个算术异常。然后程序会进入catch块 ,通过模式匹配将这个算术异常捕获,打印出异常的信息。接着,程序会执行finally块 的代码,打印出一条“执行完毕”的信息。