2

这按预期工作

scala> 3 匹配 { case x:Int => 2*x }
res1: 整数 = 6

为什么会失败?

scala> 3 匹配 { case $x:Int => 2*$x }
:1: 错误: '=>' 预期但 ':' 找到。
       3 匹配 { case $x:Int => 2*$x }
                        ^

scala> 3 匹配 { case `$x`:Int => 2*$x }
:1: 错误: '=>' 预期但 ':' 找到。
       3 匹配 { case `$x`:Int => 2*$x }
                          ^

scala> 3 匹配 { case `$x` : Int => 2*$x }
:1: 错误: '=>' 预期但 ':' 找到。
       3 匹配 { case `$x` : Int => 2*$x }

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

scala> var y = 1
y: 整数 = 1

scala> var $y = 2
$y: 整数 = 2

谢谢

4

4 回答 4

15

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

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

所以这个错误语言规范的正式部分。

于 2010-04-27T01:21:32.737 回答
7

即使不鼓励这样做,$ 也可以写在标识符中。但是以 $ 开头的标识符不能算作变量标识符——只有以小写字母开头的标识符才算。另一方面,类型化模式 id : Type 需要在 : 前面有一个变量标识符。这就是匹配被拒绝的原因。

于 2010-04-27T22:21:13.920 回答
4

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

而且,为了 100% 清楚,“保留”意味着你不能用它声明标识符并期望你的代码工作。

于 2010-04-27T01:12:19.413 回答
4

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

于 2010-12-25T13:27:33.097 回答