9.5 case
表达式里的模式变量和常量
我们已经见识了如何为要匹配的val
定义占位符(比如匹配元组的a
和b
),这些就是模式变量。不过,定义的时候需要小心。按照约定,Scala中模式变量要以小写字母开头,常量要以大写字母开头。所以,下面的代码无法通过编译。Scala会假设max
是一个模式变量,即使在当前作用域内有一个有着同样名字的字段。但是匹配min
的时候就不会有困难,因为它是以大写字母开头。
PatternMatching/MatchWithValsError.scala
class Sample {
val max = 100
val MIN = 0
def process(input: Int) {
input match {
case max => println("Don't try this at home") // Compiler error
case MIN => println("You matched min")
case _ => println("Unreachable!!")
}
}
}
在case
表达式里,引用这种讨厌的字段时可以显式的指定作用域。(如果ObjectName
是个单例或是伴生对象,可以用ObjectName.fieldName
,如果obj
是个引用,可以用obj.fieldName
。)
上面代码修正如下:
PatternMatching/MatchWithValsOK.scala
class Sample {
val max = 100
val MIN = 0
def process(input: Int) {
input match {
case this.max => println("You matched max")
case MIN => println("You matched min")
case _ => println("Unmatched")
}
}
}
new Sample().process(100)
new Sample().process(0)
new Sample().process(10)
现在,输出如下:
You matched max
You matched min
Unmatched
在真实的应用里,很快我们就会发现仅仅匹配简单的字面量、元组和对象是远远不够的。我们需要匹配更复杂的模式。Scala给了我们两个选择:case
类和提取器,依次来看一下。