在Scala中使用稳定标识符的后果是什么?

时间:2017-07-22 08:28:18

标签: scala identifier

在Scala中,我听说标识符是稳定的'如果它以大写字母开头或用反引号包围。标识符在Scala中是否稳定意味着什么?这有什么副作用?最后,这是否与常规相关,建议使用常量(如Java中的static final)以大写字母开头?

2 个答案:

答案 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?

Why does pattern matching in Scala not work with variables?