0

谁能解释这个片段的行为:

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 时,为什么会有区别?

4

1 回答 1

6

该表达式与范围内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")
  }
}

编辑:这被称为Scala 语言规范 §8.1.5 中定义的稳定标识符模式

于 2015-12-07T09:31:02.547 回答