如果我们以下面的代码片段为例:

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

原始数组发生变异。我期待通过将数组(对象)传递给 change 函数并为其分配一个新变量来避免突变。我知道 built_collection library 似乎是不可变集合的主要选择。核心库是否有任何本地方式可以允许深度卡住或防止副作用(另一个函数内部的操作)?

最佳答案

对象通过引用传递。这是设计使然:对象通常是大型数据结构,每次将对象传递给函数时在内部进行复制可能非常低效。 (这与其他主要面向对象语言使用的方法相同。)

因此,arraynewArray 是代码中相同底层 List 的两个名称。

如果要显式创建新列表,只需更改

var newArray = array;

至:
var newArray = new List.from(array);

关于object - 避免Dart-lang中的对象突变的方法有哪些?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41121999/

10-10 03:28