任何人都可以解释这个片段的行为:
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
shadow new the external定义的新变量.
如果要匹配现有变量,请使用反引号:
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节中定义的稳定标识符模式