Почему scala не допускает использование идентификатора $ в выражении case? - PullRequest
2 голосов
/ 27 апреля 2010

это работает как ожидалось

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 ]

15 голосов
/ 27 апреля 2010

Из «Спецификации языка Scala», глава 1 («Лексический синтаксис»):

"Символ‘ $ "зарезервирован для идентификаторов, синтезированных компилятором. Пользовательские программы не должен определять идентификаторы, которые содержат символы «$». "

Так что non -bug является формальной частью спецификации языка.

7 голосов
/ 28 апреля 2010

Даже если это не рекомендуется, $ можно записать в идентификаторах. Но идентификатор, начинающийся с $, не считается идентификатором переменной - только идентификаторы, начинающиеся со строчных букв. С другой стороны, для типизированного шаблона id: Type требуется идентификатор переменной перед:. Вот почему матч отклонен.

4 голосов
/ 25 декабря 2010

На самом деле, хотя все остальные ответы в некотором смысле верны, объяснение здесь проще.Знак доллара считается прописной буквой в соответствии со спецификацией и, таким образом, обрабатывается как константа в сопоставлении с образцом.

4 голосов
/ 27 апреля 2010

Хотя допустимо в идентификаторах, $ зарезервировано для использования компилятором. Вы увидите много случаев использования $, если, например, вызовете код Scala из Java.

И, чтобы сделать его на 100% понятным, «зарезервированный» означает, что вы не можете объявить идентификаторы с ним и ожидать, что ваш код будет работать.

...