选项文字与选项变量

Option literal vs. Option variable

谁能解释一下这段代码的行为:

def test = {
  val xt: Option[String] = Some("1")
  val xx: String = "2"
  xt match {
    case Some(xx) => println("match")
    case _ => println("no match")
  }
  xt match {
    case Some("2") => println("match")
    case _ => println("no match")
  }
}

结果是

match
noMatch

为什么当我根据字符串字面值更改 val 时会有所不同?

表达式 case Some(xx) 不匹配范围内的 xx 的值,而是匹配 任何东西 并将该结果绑定到名为 xx 的新变量,隐藏了外部定义。

如果要匹配现有变量,请使用反引号:

def test = {
  val xt: Option[String] = Some("1")
  val xx: String = "2"
  xt match {
    case Some(`xx`) => println("match")
    case _ => println("no match")
  }
  xt match {
    case Some("2") => println("match")
    case _ => println("no match")
  }
}

或重命名变量以大写字母开头:

def test = {
  val xt: Option[String] = Some("1")
  val Xx: String = "2"
  xt match {
    case Some(Xx) => println("match")
    case _ => println("no match")
  }
  xt match {
    case Some("2") => println("match")
    case _ => println("no match")
  }
}

edit:这在Scala语言规范中的§8.1.5中定义为Stable Identifier Pattern