2016-12-13 41 views
5

Jeżeli weźmiemy pod uwagę następujący fragment jako przykład:Jakie są sposoby unikania mutacji obiektu w Dart-lang?

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; 
} 

Oryginalna tablica zostanie zmutowany. Spodziewałem się tego, przekazując tablicę (obiekt) do funkcji zmiany i przypisując jej nową zmienną, żebym mógł uniknąć mutacji. Jestem świadomy, że built_collection library wydaje się być głównym krokiem do niezmiennych kolekcji. Czy istnieje rdzenna biblioteka rdzeniowa pozwalająca na głębokie zamrożenie lub zapobieganie efektom ubocznym (operacje wewnątrz innej funkcji)?

Odpowiedz

2

Obiekty są przekazywane przez odniesienie. Jest to zgodne z projektem: obiekty są często dużymi strukturami danych i wewnętrznie tworzenie kopii za każdym razem, gdy obiekt jest przekazywany do funkcji, może być bardzo nieefektywne. (To samo podejście, jak stosowane przez innych językach zorientowanych obiektowo dur).

W rezultacie array i newArray są dwie nazwy dla samym leżącej List w kodzie.

Jeśli chcesz jawnie utworzyć nową listę, wystarczy zmienić

var newArray = array; 

do:

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

Możesz zawinąć tablicę w UnmodifiableListView od dart:collection i przekazać ją zamiast samej tablicy. Myślę, że to najbardziej podstawowy sposób działania.

+0

Dzięki za cynk. Chociaż to podejście podniosłoby wyjątek, gdy 'UnmodifiableListView' został przekazany (i próbował zostać zmieniony) w innej funkcji. –

+1

Czego oczekujesz, gdy zmodyfikujesz niezmodyfikowaną tablicę? –