为什么scala不允许在case语句中使用'$'标识符?

时间:2010-04-26 23:53:43

标签: scala language-features scala-2.8

这可以按预期工作

scala> 3 match { case x:Int => 2*x }
res1: Int = 6

为什么会失败?

scala> 3 match { case $x:Int => 2*$x }
:1: error: '=>' expected but ':' found.
       3 match { case $x:Int => 2*$x }
                        ^

scala> 3 match { case `$x`:Int => 2*$x }
:1: error: '=>' expected but ':' found.
       3 match { case `$x`:Int => 2*$x }
                          ^

scala> 3 match { case `$x` : Int => 2*$x }
:1: error: '=>' expected but ':' found.
       3 match { case `$x` : Int => 2*$x }

'$'应该是一个有效的标识符字符,如下所示:

scala> var y = 1
y: Int = 1

scala> var $y = 2
$y: Int = 2

由于

4 个答案:

答案 0 :(得分:15)

来自“Scala语言规范”,第1章(“词法语法”):

“'$'字符保留用于编译器合成的标识符。用户程序 不应该定义包含'$'字符的标识符。“

所以这个 -bug 语言规范的正式部分。

答案 1 :(得分:7)

即使不鼓励,也可以用标识符写出$。但是以$开头的标识符不算作变量标识符 - 只有以小写字母开头的标识符。另一方面,类型化模式id:Type需要在:前面的变量标识符。这就是比赛被拒绝的原因。

答案 2 :(得分:4)

虽然标识符合法,但$保留供编译器使用。例如,如果从Java调用Scala代码,您会看到很多$用法。

并且,为了使其100%清晰,“保留”意味着您无法使用它声明标识符并期望您的代码能够正常工作。

答案 3 :(得分:4)

实际上,虽然所有其他答案在某种意义上都是正确的,但这里的解释更为简单。根据规范,美元符号被视为大写字母,因此在模式匹配中被视为常量。