2016-12-13 2 views
5

Если мы возьмем следующий фрагмент кода в качестве примера:Каковы способы избежать мутации объекта в Дарт-ланге?

main() { 
    List<int> array = [1, 2, 3, 4]; 
    List<int> newArray = change(array); 

    print(array); // [99, 2, 3, 4] 
    print(newArray); // [99, 2, 3, 4] 
    print(newArray == array); // true 
} 

change(List<int> array) { 
    var newArray = array; 
    newArray[0] = 99; 
    return newArray; 
} 

Исходный массив получает мутировал. Я ожидал, что, передав массив (объект) функции изменения и присвоив ей новую переменную, я мог бы избежать мутации. Я знаю, что built_collection library походит на главную коллекцию неизменных коллекций. Есть ли какой-либо родной путь к основной библиотеке, которая позволит глубоко замерзать или предотвращать побочные эффекты (операции внутри другой функции)?

ответ

2

Объекты передаются по ссылке. Это по дизайну: объекты часто представляют собой большие структуры данных и внутренне делают копию каждый раз, когда объект передается функции, могут быть очень неэффективными. (Это тот же подход, который используется другими основным объектно-ориентированных языков.)

В результате array и newArray два названия для же, лежащей в основе List в вашем коде.

Если вы хотите явно создать новый список, просто изменить

var newArray = array; 

в:

var newArray = new List.from(array); 
2

Вы можете обернуть массив в UnmodifiableListView от dart:collection и передать это вместо самого массива. Я думаю, что это самый простой способ заработать.

+0

Спасибо за подсказку. Хотя этот подход может вызвать исключение, когда «UnmodifiableListView» передается (и пытается получить изменение) в другой функции. –

+1

Что вы ожидаете, когда будете модифицировать неизменяемый массив? –

Смежные вопросы