Как часто вы сталкивались с проблемой изменения данных, переданных в качестве параметра? Иллюстрация:
int getCountBagel(List<String> list) { list.retainWhere((e) => e == '?'); return list.length; } main() { final basket = ['?', '?', '?', '?', '?']; final countBagel = getCountBagel(basket); // 2 print(basket); // [?, ?] }
Выполнив копирование getCountBagel([...basket]), вы обезопасите себя. Да, это ужасный способ посчитать количество элементов. Но представьте, что вы зависите от стороннего api, к которому у вас нет непосредственного доступа.
Обратная задача: в Dart примитивные типы всегда передаются по значению. Это означает, что если вы передаёте экземпляр примитивного типа в качестве параметра в функцию (или класс) и внутри его изменяете, то оригинальный экземпляр останется неизменным:
void increase(int i) => i++; main() { int i = 0; increase(i); print(i); // 0 }
Если вы хотите передать что-то по ссылке, то заверните это в класс:
class Wrapper { Wrapper(this.i); int i; } void increase(Wrapper w) => w.i++; main() { final w = Wrapper(0); increase(w); print(w.i); // 1 }
но такой способ ухудшит SRP (принцип единой ответственности) и усложнит тестирование функции increase... Ответ в комментарии ?
