Как часто вы сталкивались с проблемой изменения данных, переданных в качестве параметра? Иллюстрация:
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
... Ответ в комментарии ?