Различное поведение val и var с анонимной функцией и заполнителем - PullRequest
6 голосов
/ 15 марта 2019

Код с val и var:

val adder: Int => Int = _ + 3 // Works fine
var adder: Int => Int = (_ + 3) // Works fine
var adder: Int => Int = _ + 3 // Error (using var, but not brackets)

Сообщение об ошибке для последней строки с var:

';'ожидается, но идентификатор найден.

Чем можно объяснить разницу в поведении между вариантами val и var?

1 Ответ

16 голосов
/ 15 марта 2019

В Scala одна из многих вещей, которые используются для подчеркивания, состоит в том, чтобы разрешить пользователям устанавливать начальное значение по умолчанию в определениях var (см. Раздел 4.2 спецификации ):

scala> var x: String = _
x: String = null

scala> var y: Int = _
y: Int = 0

Похоже, проблема, с которой вы сталкиваетесь, заключается в том, что знак подчеркивания, следующий сразу за = в определении var, интерпретируется как это специальное начальное значение по умолчанию, а альтернативное использование в качестве заполнителя в функции не рассматривается.

Такое поведение кажется мне ошибкой.Я почти уверен, что это не может быть оправдано спецификацией, и вполне разумно ожидать, что компилятор рассмотрит оба синтаксических использования _.На первый взгляд, я не могу поднять проблему, хотя.Если вам не безразлично, вы можете попытаться сообщить об этом сами.

Поскольку вы на самом деле не задаете вопрос, я просто предполагаю, какая информация будет вам полезна.Вы, вероятно, не спрашиваете об обходных путях, так как у вас есть один прямо во второй строке, так что, вероятно, вы просто задаетесь вопросом, что с этим происходит, и в этом случае ответ заключается в том, что компилятор Scala все ещев некоторой степени глючит путаница, особенно в менее используемых или ухоженных областях языка (например, var определения).

...