Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么scala不允许'$';case语句中的标识符?_Scala_Language Features_Scala 2.8 - Fatal编程技术网

为什么scala不允许'$';case语句中的标识符?

为什么scala不允许'$';case语句中的标识符?,scala,language-features,scala-2.8,Scala,Language Features,Scala 2.8,这是意料之中的事 scala> 3 match { case x:Int => 2*x } res1: Int = 6 scala>3匹配{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 } res1: Int = 6 scala>3匹配{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>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: Int = 1 scala> var $y = 2 $y: Int = 2 scala>vary=1 y:Int=1 scala>var$y=2 $y:Int=2
谢谢

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

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

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

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


因此,这个非bug是语言规范的一个正式部分。

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

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

我正在编写一种特定于域的语言,用于使用Scala编译PHP脚本。我认为这是因为“$”是编译器的保留项。为什么输入语言的变量需要显示在编译器实现中?如果要翻译成Scala代码,一般来说应该损坏标识符,特别是要避免
$
。我想保留PHP的“感觉”,还要避免名称冲突而不损坏标识符。我不明白。您正在将PHP转换为Scala。谁在乎斯卡拉是什么样子?在Scala中保留PHP的“感觉”到底意味着什么?这是一个bug还是Scala规范中的某个地方?谢谢。Scala编译器至少应该发出警告!谢谢,这就解释了为什么match/case是我发现“$”有问题的仅有两个地方之一。另一个是尝试创建和传递匿名函数(我猜编译为内部模式匹配??)。