13.3 模式中的变量和常量
如果在case
关键字后跟变量名,那么match
前表达式的值会赋给那个变量
package com.atguigu.day11.moshipipei
object MatchDemo4 {
def main(args: Array[String]): Unit = {
var ch = 0
'z' match {
case 'a' => println("a...")
case 'b' => println("b...")
case 'c' => println("c...")
case ch => println("变量 ch = " + ch)
}
}
}
注意:
如果
case ch
匹配成功了, 则后面即使跟上case _
也不会再匹配其实
case _
就是case 变量名
的特例, 你可以把_
当做一个变量来对待.
但是:
按照约定, Scala 期望模式变量名都以小写字母开头, 而常量名则是大写字母(只要首字母大写也可以)。
如果你使用大写字母的名称,Scala 将会在作用域范围内查找常量。
但是,如果使用的是非大写字母的名称,它将只假设其是一个
在下面的代码中,我们定义了一个和字段具有相同名称的模式变量, 但是这段代码将不会给出我们想要的结果—--模式变量隐藏了(Sample 类的)max
字段。
object PatternTest {
def main(args: Array[String]): Unit = {
val sample = new Sample
sample.process(1000)
}
}
class Sample {
val max = 10000
def process(input: Int): Unit = {
input match {
case max => println(s"You matched max")
}
}
}
说明:
你会发现 scala 把
max
推断为模式变量, 而不是模式常量.解决办法:
- 办法1: 明确指定作用域:
this.max
- 办法2: 使用反引号类给 scala 提示.
case `max` => .....
- 办法3: 把
max
变成大写:MAX
- 办法1: 明确指定作用域: