前面例子中的 unapply 方法在匹配成功时返回一个二元组。这可以很容易的推广到多于两个变量的情况。为了绑定N个变量,unapply 方法可以返回一个 N 元祖,封装在 Some 中。对于一个只绑定一个变量的情况有些特殊。Scala 没有所谓“一元组”,为返回一个变量,该变量直接封装在 Some 中返回。下面的例子的 Twice 匹配一个含有两个连续的相同字符串的情况。
前面我们介绍了使用模式匹配来分解数据,本专题教程对这些概念加以推广。到目前为止,构造器模式是和 Case Class 关联在一起的。有些时候你希望使用类似的模式而不需要创建 Case Class。实际上你可能希望创建自定义的模式。 Extractor(解析器)可以帮助你完成这些任务。本篇以一个简单的例子来介绍 Extractor 的概念和用法。
在 Scala 专题教程里我们介绍了使用模式匹配来分解数据,本教程对这些概念加以推广。到目前为止,构造器模式是和 Case Class 关联在一起的。有些时候你希望使用类似的模式而不需要创建 Case Class。实际上你可能希望创建自定义的模式。 Extractor(解析器)可以帮助你完成这些任务。本篇以一个简单的例子来介绍 Extractor 的概念和用法。
Scala 程序很多地方都可以使用模式,而不仅仅用在模式匹配( match 表达式),本篇给出几种使用模式的情况。变量定义任何时候你使用 val 或 var 定义变量时,你都可以使用模式定义多个变量,此时你定义元组,分别赋值到不同的变量。 scala> val myTuple=(134,"abc") myTuple: (Int, String) = (134,abc) scala>
Scala 在匹配模式时,按照模式定义的顺序依次检查,因此越特定的规则越要先定义,而通用的规则后定义。比如我们修改之前的 def simplifyTop(expr :Expr) :Expr = expr match { case UnOp("-",UnOp("-",e))=>e case BinOp("+",e,Number(0))=>e case BinOp("*",e,Number(1))=>e case _ =>
构造器模式构造器模式功能非常强大,比如一个构造器模式可以定义为 BinOp(“+”,e,Number(0))。它由一个名称 BinOp(某个 case class 的名称)和一系列有括号分开的模式构成(“+”,e 和 Number(0))。这个模式首先检查输入对象是否是 BinOp 类型的对象,然后检查构造器参数是否匹配输入的对象。
上个例子显示了几种不同的模式:常量模式,通配模式,变量模式等,本篇逐个介绍模式的种类。通配模式通配符“_”可以用来匹配任意对象,通常在模式匹配中作为最后一个匹配项,匹配其它所有的输入对象。比如: expr match { case BinOp(op,left,right) => println( expr + " is a binary operation") case _ =>
本专题侧重介绍 Scala 的 case class 和 pattern matching (模式匹配),这俩个两个程序结构对于处理树结构的数据非常有帮助。 Scala 的 case class 使得对对象进行模式匹配变得非常方便,简单的来说,Scala 的 case clas s就是在普通的类定义前加 case 这个关键字,然后你可以对这些类来模式匹配。
除了前面介绍的预先初始化成员值外,你还是让系统自行决定何时初始化成员的初始值,这是通过在 val 定义前面添加 lazy(懒惰),也是说直到你第一次需要引用该成员是,系统才会去初始化,否则该成员就不初始化(这也是 lazy 的由来:-)).首先我们定义一个正常定义 val 的例子:object Demo { val x = { println("initializing x");