Когда a + = b становится a = a + b в Scala?

Scala только иногда десугаров

a += b

в

a = a + b

но не всегда. Например, некоторые изменчивые коллекции определяют метод +=, где вместо этого он становится

a.+=(b)

Это поведение

  1. полностью определяется, существует ли подходящий метод += на a? (в том числе есть ли другие примеры такого поведения?)
  2. независимо от того, являются ли объекты val или var?

Соответствующий пример

Адаптировано из программирования в Scala, в

var s = Set("a", "b")
s += "c"

В этом случае вторая строка кода s += "c" существенно сокращается:

s = s + "c"

Ответ 1

Когда a + = b становится a = a + b в Scala?

Когда нет применимого метода +=, существует применимый метод + а a можно присваивать (т.е. Это var или есть метод a_=).

Или, как показывает спецификация:

Повторная интерпретация происходит, если выполняются следующие два условия.

  1. Левая сторона l не имеет члена с именем +=, а также не может быть преобразована путем неявного преобразования в значение с членом с именем +=.
  2. Назначение l = l + r является корректным по типу. В частности, это означает, что l ссылается на переменную или объект, которые могут быть назначены, и это можно преобразовать в значение с членом с именем +.

Это поведение

  1. полностью определяется, существует ли подходящий метод + = на a?
  2. независимо от того, являются ли объекты val или var?

Не совсем. Если есть подходящий += метод, она будет называться независимо от любых других факторов (такие, как быть переназначить). a Но когда этого не происходит, другие факторы определяют, будет ли оно отменено или вы получите сообщение об ошибке.

Обратите внимание, что появившееся сообщение об ошибке отличается от того, которое вы получили из desugared версии: Когда критерии для desugaring не применяются, вы получите сообщение об ошибке, которое сообщает вам: "+ = не является членом... ", а также объяснение, почему десураринг не может быть применен (например," приемник не назначается "или ошибка типа, которую вы получили бы от a + b если a + b приведет к ошибке типа).

Ответ 2

В моем первом ответе я немного поспешил, извинился. После небольшого исследования и после лучшего чтения ответ и комментарий @sepp2k я пришел к выводу, что некоторые классы в Scala реализуют метод +=, а другой - только метод +, я немного сыграл с некоторым кодом Scala и, например:

  //Set, Int, Double, String implements the "+" method,
  //and then "+=" is syntactic sugar of a = a + b 
  var set = Set("a", "b")
  set += "c"

  var num = 3
  num += 2

  var str = "43"
  str += 5

  var l = List()
  l += "someString"

  // As you mention, MutableList implements "+=" method, and when you do
  // mutL += 4, is the same as call the method mutL.+=
  var mutL = new mutable.MutableList[Int]
  mutL += 4