Option literal与Option变量

时间:2015-12-07 09:26:00

标签: scala referential

任何人都可以解释此代码段的行为:

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时有区别?

1 个答案:

答案 0 :(得分:6)

表达式case Some(xx)与范围内的xx的值不匹配,而是匹配任何并将结果绑定到名为{{的新变量1}},遮蔽外部定义。

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

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")
  }
}

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