Si tomamos el siguiente fragmento como ejemplo:

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

La matriz original se muta. Esperaba que al pasar la matriz (objeto) a la función de cambio y asignarle una nueva variable pudiera evitar la mutación. Soy consciente de que la biblioteca built_collection parece ser el recurso principal para las colecciones inmutables. ¿Existe alguna forma nativa de la biblioteca central que permita una congelación profunda o prevenga efectos secundarios (operaciones dentro de otra función)?

7
Mohamed Hayibor 13 dic. 2016 a las 16:10

2 respuestas

La mejor respuesta

Los objetos se pasan por referencia. Esto es así por diseño: los objetos suelen ser grandes estructuras de datos y realizar una copia internamente cada vez que se pasa un objeto a una función puede resultar muy ineficaz. (Este es el mismo enfoque que utilizan otros lenguajes orientados a objetos importantes).

Como resultado, array y newArray son dos nombres para el mismo subyacente List en su código.

Si desea crear explícitamente una nueva lista, simplemente cambie

var newArray = array;

Para:

var newArray = new List.from(array);
4
Richard Ambler 19 feb. 2017 a las 11:58

Puede envolver una matriz en un UnmodifiableListView de dart:collection y pasar esto en lugar de la matriz en sí. Creo que esta es la forma incorporada más básica.

5
Günter Zöchbauer 13 dic. 2016 a las 14:58