Ответ 1
Когда a + = b становится a = a + b в Scala?
Когда нет применимого метода +=
, существует применимый метод +
а a
можно присваивать (т.е. Это var
или есть метод a_=
).
Или, как показывает спецификация:
Повторная интерпретация происходит, если выполняются следующие два условия.
- Левая сторона
l
не имеет члена с именем+=
, а также не может быть преобразована путем неявного преобразования в значение с членом с именем+=
.- Назначение
l = l + r
является корректным по типу. В частности, это означает, чтоl
ссылается на переменную или объект, которые могут быть назначены, и это можно преобразовать в значение с членом с именем+
.
Это поведение
- полностью определяется, существует ли подходящий метод + = на a?
- независимо от того, являются ли объекты val или var?
Не совсем. Если есть подходящий +=
метод, она будет называться независимо от любых других факторов (такие, как быть переназначить). a
Но когда этого не происходит, другие факторы определяют, будет ли оно отменено или вы получите сообщение об ошибке.
Обратите внимание, что появившееся сообщение об ошибке отличается от того, которое вы получили из desugared версии: Когда критерии для desugaring не применяются, вы получите сообщение об ошибке, которое сообщает вам: "+ = не является членом... ", а также объяснение, почему десураринг не может быть применен (например," приемник не назначается "или ошибка типа, которую вы получили бы от a + b
если a + b
приведет к ошибке типа).