选项文字与选项变量
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
谁能解释一下这段代码的行为:
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