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

Ale*_*x R 2 language-features scala 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

谢谢

Ran*_*ulz 15

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

"'$'字符是为编译器合成的标识符保留的.用户程序不应该定义包含'$'字符的标识符."

所以这个 bb 语言规范的正式部分.


Mar*_*sky 7

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