Проблема с пространством в установщике классов Scala - PullRequest
0 голосов
/ 05 августа 2020

Я Scala новичок ie, и одна вещь, которую я нахожу очень странной, - это ошибка

";" или ожидается новая строка

, например, определение класса Point в Tour of scala section Private Members и Getter / Setter Syntax , если я напишу код вот так

def x_ = (newValue : Int): Unit = {}

Я получу ; или ожидается новая строка , и она не распознает новую строку. Обратите внимание на пробел после x_ . и если я напишу это без пробела, например,

def x_= (newValue : Int): Unit = {}

, упомянутые ошибки исчезнут?!

Почему? связано ли это с языком scala или с intellij ide. Если это как-то связано с языком, то почему бы мне не получить ошибку в этом определении

def x = _x

Ответы [ 2 ]

4 голосов
/ 05 августа 2020

Пробелы: не разрешены в идентификаторах, поэтому

def x_ = = 42

не допускается по той же причине, по которой

def hello_ world = 42

не допускается. Если вы хотите использовать пробелы в идентификаторе, заключите его в кавычки

scala> def `x_ =` = 42
def x_$u0020$eq: Int

scala> `x_ =`
val res0: Int = 42

scala> def `hello_ world` = 42
def hello_$u0020world: Int

scala> `hello_ world`
val res1: Int = 42

Идентификатор x_= не имеет пробелов, поэтому следующее допустимо:

scala> def x_= = 42
def x_$eq: Int

scala> x_=
val res2: Int = 42

Не то, как два = в def x_= = 42 семантически разные

def x_=               = 42
      |               |   
part of identifier   body follows
2 голосов
/ 05 августа 2020

Ответ (как вы выяснили) состоит в том, что _= обрабатывается специально в конце имени метода. (См. SP c)

Итак, это действительно

def x_= (newValue : Int): Unit = {}

, но это не

def x= (newValue : Int): Unit = {}

и это тоже

def x_=x (newValue : Int): Unit = {}

Фактически, в разделе 1.1 spe c говорится, что после _ может быть любое op, поэтому они также действительны:

def x_#(newValue : Int): Unit = {}
def x_+-*/(newValue : Int): Unit = {}
def x_???(newValue : Int): Unit = {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...