Изменяемый набор + = возвращаемое значение в Scala - PullRequest
0 голосов
/ 24 августа 2018

Насколько я понимаю, смысл использования метода += на изменяемых множествах состоит в том, что

val s = collection.mutable.Set(1)
s += 2  // s is now a mutable Set(1, 2)

имеет эффект, аналогичный

var s = Set(1) // immutable
s += 2  // s is now an immutable Set(1, 2)

Если это так, почему метод += в изменяемом наборе возвращает сам набор? Разве это не затруднит рефакторинг кода, например

val s = collection.mutable.Set(1)
val s1 = s += 2  // s and s1 are now mutable Set(1, 2)

не может быть реорганизован в

var s = Set(1) // immutable
var s1 = s += 2  // s is immutable Set(1, 2), s1 is now ()

при сохранении первоначального значения. В чем причина этого дизайнерского решения?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

В неизменном случае s += 2 совпадает с s = s + 2.Таким образом, если вы заставите s += 2 вычислить новое значение s, то вы должны будете заставить каждый оператор присваивания оценивать результат присваивания.Другие языки делают это таким образом, но это исторически приводило к ошибкам, например, с кодом C:

if (x = 0) {
  ...
}

Так что я думаю, что имеет смысл не возвращать этот набор.

С другой стороны, для изменчивого случая += - это просто имя метода, поэтому он не выполняет присваивания и не может по-настоящему отвечать за этот тип ошибки.И его возвращение само по себе позволяет создавать цепочки шаблонов строителей, которые иногда полезны.

0 голосов
/ 24 августа 2018

(Это, очевидно, всего лишь предположение)

Изменяемые коллекции Scala предназначались для использования в качестве Builder s для неизменяемых коллекций.На JVM существует одна очень выдающаяся и очень древняя неизменная структура данных: String.Соответствующий конструктор (никак не связанный с Scala) уже существовал в Java: это был StringBuilder .Если вы загляните в документацию, вы увидите десятки версий перегруженного метода append.Каждый раз он возвращает сам StringBuilder, что позволяет написать следующее:

// java code
myBuilder
  .append('h')
  .append('i');

Я предполагаю, что Scala collection.mutable API просто имитировал поведение Java StringBuilder, но заменилappend(...) несколько короче +=.В конце концов, это просто реализация классического строительного паттерна .

...