在 Dart-lang 中避免对象突变的方法是啥?

Posted

技术标签:

【中文标题】在 Dart-lang 中避免对象突变的方法是啥?【英文标题】:What are the ways to avoid object mutation in Dart-lang?在 Dart-lang 中避免对象突变的方法是什么? 【发布时间】:2017-04-28 13:36:43 【问题描述】:

如果我们以下面的sn-p为例:

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 似乎是不可变集合的主要选择。核心库是否有任何原生方式可以允许深度冻结或防止副作用(另一个函数内部的操作)?

【问题讨论】:

【参考方案1】:

您可以将数组包装在来自dart:collectionUnmodifiableListView 中并传递它而不是数组本身。我认为这是最基本的内置方式。

【讨论】:

感谢您的提示。虽然这种方法会在 UnmodifiableListView 在另一个函数中传递(并尝试更改)时引发异常。 当你修改一个不可修改的数组时,你期望会发生什么?【参考方案2】:

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

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

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

var newArray = array;

到:

var newArray = new List.from(array);

【讨论】:

以上是关于在 Dart-lang 中避免对象突变的方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Prisma 和 Apollo 调用多个 GraphQL 突变的正确方法是啥

发布 AWS Amplify GraphQL 突变时如何避免在数组中创建重复项

避免在循环中使用嵌套的可观察订阅的正确方法是啥?

函数式编程

AWS Amplify CLI 生成的 GraphQL 突变中的 $condition 输入参数是啥?

Vuex:突变中的均方括号是啥?