Groovy List Проблемы с параметрами: + = не работает, но .add () работает - PullRequest
3 голосов
/ 27 июля 2010
public updateList(lst) {
  lst += "a"
}

List lst = []
updateList(lst)
println(lst)

Это печатает пустой список.Тем не менее,

public updateList(lst) {
  lst.add("a")
}

List lst = []
updateList(lst)
println(lst)

, напечатает «a» по желанию.

Я всегда предполагал, что + = было таким же, как .add (), но, очевидно, нет.Я предполагаю, что + = создает новый список, тогда как .add () только обновил существующий список?

1 Ответ

7 голосов
/ 27 июля 2010

Первый метод вызывает plus для переменной lst

Как мы видим из документации это будет:

Создать коллекцию как объединение Коллекция и предмет.

Таким образом, будет возвращена новая коллекция, а исходная lst (выходящая за рамки этого метода) останется неизменной. (Очевидно, что внутри области действия этого метода lst будет новым списком с одним элементом)

Это можно увидеть, распечатав результат метода updateList:

public updateList(lst) {
  lst += "a"  // calls plus, creates a new list, and returns this new list.
              // lst (outside the context of this method) is unmodified
}

List lst = []
println( updateList(lst) )

Если вы вызываете add, то вы вызываете стандартный метод добавления Java .

public updateList(lst) {
  lst.add "a"
}

Итак, оригинал lst модифицирован

Альтернативой add будет использование оператора leftShift:

public updateList(lst) {
  lst << "a"
}

Какие вызовы добавить за кулисами: (код из исходного кода Groovy)

public static <T> Collection<T> leftShift(Collection<T> self, T value) {
    self.add(value);
    return self;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...