【问题标题】:What is the use of returning [...list] in Dart?在 Dart 中返回 [...list] 有什么用?
【发布时间】:2020-11-08 13:41:30
【问题描述】:

在 Dart 编程语言中,有时我会看到函数返回一个包含三个点 [...list] 的括号中的列表。例如:

class IntList {
    List<int> _integerList = [1, 2, 3, 4, 5];
    List<int> get integerList {
        return [..._integerList];
    }
}

那么return integerList;和上面的return语句有什么区别呢?

非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: list dart return-value


    【解决方案1】:

    对于这种特殊情况,没有区别。 ... 是展开运算符。这允许您将多个元素插入到集合中。

    例如:

    var list = [1, 2, 3];
    var list2 = [0, ...list];
    print(list2)
    
    Output:
    [0, 1, 2, 3]
    

    所以return [..._integerList]; 与返回integerList; 完全相同,只是它会创建一个新列表。


    var list = [1, 2, 3];
    print(list.hashCode);
    print([...list].hashCode);
    

    这段代码表明,当使用扩展运算符时,它们是不同的List对象,因为输出的哈希码不同。

    【讨论】:

    • 你能解释一下关于创建新列表的更多信息吗?
    • @CodeNewbie 它正在创建一个新的List 对象,而不是重用现有的对象我相信。不过,我对此不是 100% 确定的。
    • @CodeNewbie 我相信我是对的。它创建一个新的List 对象。我在答案中添加了一个示例来显示这一点。
    • “对于这种特殊情况,没有区别......除了它会创建一个新列表”......创建一个副本是以这种方式使用扩展运算符的全部原因。您不希望调用者能够直接改变对象的内部列表。
    • 对于那只海豚,你也可以使用UnmodifiableListViewList.unmodifiable(我认为不同之处在于UnmodifiableListView 创建了一个Iterable 的视图,而List.unmodifiable 创建了一个全新的列表)。如果您尝试改变该列表,则会引发错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多