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
Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-07-02 08:12:45

results matching ""

    No results matching ""