这可以按预期工作
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
由于
答案 0 :(得分:15)
来自“Scala语言规范”,第1章(“词法语法”):
“'$'字符保留用于编译器合成的标识符。用户程序 不应该定义包含'$'字符的标识符。“
所以这个非 -bug 是语言规范的正式部分。
答案 1 :(得分:7)
即使不鼓励,也可以用标识符写出$。但是以$开头的标识符不算作变量标识符 - 只有以小写字母开头的标识符。另一方面,类型化模式id:Type需要在:前面的变量标识符。这就是比赛被拒绝的原因。
答案 2 :(得分:4)
虽然标识符合法,但$
保留供编译器使用。例如,如果从Java调用Scala代码,您会看到很多$
用法。
并且,为了使其100%清晰,“保留”意味着您无法使用它声明标识符并期望您的代码能够正常工作。
答案 3 :(得分:4)
实际上,虽然所有其他答案在某种意义上都是正确的,但这里的解释更为简单。根据规范,美元符号被视为大写字母,因此在模式匹配中被视为常量。