Использование подчеркивания в идентификаторе Scala

У меня есть класс с геттером/сеттером:

class Person {
    private var _age = 0

    //getter
    def age = _age

    //setter
    def age_=(value: Int): Unit = _age = value
}

Мы знаем, что можем вызвать метод setter следующим образом:

val p = new Person()
p.age= (2)
p age= 11
p.age= 8-4

Что интересно в этом случае, так это то, что подчеркивание (_) в def age_= может быть удалено при вызове метода.

Мой вопрос: для чего в этом случае используется подчеркивание?

Кто-то сказал мне, что он используется для разделения небуквенных символов в идентификаторе. Итак, я попробовал это:

var x_= = 20
x_= = 10
x= = 5    // I got error here

Почему я не могу убрать подчеркивание в этом случае?

Кроме того, если я попытался использовать подчеркивание более одного раза:

val x_=_x = 1

У меня тоже ошибка компиляции.

Есть ли правило об использовании подчеркивания и каков термин для этого использования подчеркивания?


person null    schedule 02.01.2015    source источник
comment
Взгляните на stackoverflow.com/questions/8000903/ для других вариантов использования подчеркивания в Scala. Этот ответ также объясняет, как работает переопределение оператора присваивания.   -  person rsenna    schedule 02.01.2015


Ответы (1)


Ошибка компиляции говорит сама за себя:

scala> var x_= = 20
<console>:10: error: Names of vals or vars may not end in `_='

Только методы могут иметь имена, оканчивающиеся на _=. Это имеет смысл, потому что было бы действительно запутанно разрешить val называться x_=

Однако верно то, что подчеркивание используется для отделения буквенно-цифровых символов от специальных символов. Просто в случае val или var нельзя заканчивать на =

scala> var x_# = 20
x_#: Int = 20
scala> x_# = 10
x_$hash: Int = 10

Я не думаю, что другое подчеркивание разрешено после первого подчеркивания, которое предшествует специальным символам.

val x_y_^ = 1    // Ok
val x_^_^ = 1    // Not ok

На основе спецификации языка Scala :

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

См. также пример 1.1.1 в связанной спецификации для примеров допустимых идентификаторов.

person Michael Zajac    schedule 02.01.2015
comment
Большое спасибо. Но каково объяснение p.age= 8-4? Подчеркивание ставить не нужно. - person null; 02.01.2015
comment
Дело не в том, что вы опускаете подчеркивание. Компилятор просто специально обрабатывает методы, оканчивающиеся на _=. то есть p.age = 8-4 обрабатывается как p.age_=(8-4). Обратите внимание, как вы можете поставить пробел. - person Michael Zajac; 02.01.2015
comment
Итак, мы можем сказать, что удаление подчеркивания в этом случае является частью синтаксиса языка? - person null; 02.01.2015
comment
Я понимаю. Я надеюсь, что в scala не будет использоваться много магических шаблонов. - person null; 02.01.2015