在Scala中,我听说标识符是稳定的'如果它以大写字母开头或用反引号包围。标识符在Scala中是否稳定意味着什么?这有什么副作用?最后,这是否与常规相关,建议使用常量(如Java中的static final
)以大写字母开头?
答案 0 :(得分:4)
根据语言reference:
稳定标识符是以标识符结尾的路径。
反引号与此术语没有直接关系。需要反引号来包装一些本身不是lexically有效标识符的内容,例如关键字。
您可能正在考虑stable identifier pattern:
要解决与变量模式的语法重叠,稳定的标识符模式可能不是以小写字母开头的简单名称。但是,可以在反引号中包含这样的变量名称;然后它被视为一个稳定的标识符模式。
这谈到的是如果你使用"正常"会发生什么?匹配模式表达式中的小写变量名称。结果是匹配将始终成功并将结果绑定到 new 绑定(这可能会影响您要使用的绑定)。
要使匹配使用现有的变量绑定,您可以使用反引号/反引号。
这与与常量命名相关的Java约定无关。这只是一个惯例。
答案 1 :(得分:3)
与不稳定标识符匹配的任意字符串的示例,(不稳定标识符的后果)
val highPriority = "High"
val lowPriority = "Low"
"i dont match lowPriority, but this pattern matches to first case" match {
case lowPriority => println("lowPriority")
case _ => println("highPriority")
}
执行第一个案例lowPriority
,但应该打印第二个案例。这是因为case lowPriority
创建了一个与任何内容匹配的变量lowPriority
。
1)向标识符lowPriority
添加反引号(阴影)可以与现有标识符lowPriority的精确值进行比较,这是您想要的。
val highPriority = "High"
val lowPriority = "Low"
"i dont match lowPriority" match {
case `lowPriority` => println("LowPriority")
case _ => println("HighPriority")
}
2)或者大写标识符可以解决问题。
val HighPriority = "High"
val LowPriority = "Low"
"i dont match LowPriority, prints second case" match {
case LowPriority => println("LowPriority")
case _ => println("HighPriority")
}
打印HighPriority
https://www.scala-lang.org/files/archive/spec/2.11/03-types.html#paths
Why can't a variable be a stable identifier?
In scala pattern matching, what is suspicious shadowing by a variable pattern?