gpt4 book ai didi

arrays - List.forEach无法修改元素?

转载 作者:行者123 更新时间:2023-12-02 01:26:59 25 4
gpt4 key购买 nike

我正在尝试创建一个列表列表来模仿 Dart 中二维数组的功能,但有一段时间我在弄清楚如何使其工作方面遇到了麻烦。

我最初使用 List.forEach 来创建列表并填充它们,但在每次循环之后,就好像我从未创建过列表一样。该代码如下所示:

currentMap = new List<List<int>>(height);
currentMap.forEach((e) {
e = new List<int>(width);
e.forEach((f) {
f = 1;
});
});

打印currentMap导致null列表。这是我现在拥有的:

currentMap = new List<List<int>>(height);
for(int i = 0; i < height; i++) {
currentMap[i] = new List<int>(width);
for(int j = 0; j < width; j++) {
currentMap[i][j] = 1;
}
}

这完全符合我的预期。

我知道这可能是一个非常基本的问题,并且我假设 forEach 不允许您修改元素,但我想要对此进行一些确认,并且 Dart API 文档确实如此不指定除了短语“将函数 f 添加到每个元素...”,这对我来说可能不太清楚。

此外,我还知道 List.filled() 构造函数之类的东西 - 这就是我开始构建其他功能的方式。

编辑:好的,我想我现在明白了。参数是“共享传递”,这意味着创建了对象引用的副本。这意味着您可以修改参数指向的可变对象的成员(如下所示):

void function(MyObject o) {
o.x = 5;
}

但尝试更改 o 指向的内容不会在退出函数后更改参数,例如:

void function(MyObject o) {
MyObject p = new MyObject();
o = p;
}

最佳答案

Dart 没有变量引用,所有元素都作为对象的引用传递,而不是变量。 (换句话说,Dart 纯粹是“共享调用”,就像 Java 和 JavaScript 一样)。

这意味着 forEach 回调的 e 参数只是一个普通的局部变量,在回调之外对其进行赋值没有任何影响。迭代器也是如此:它们返回可迭代对象中的值,但此后它不再引用可迭代对象。

当你执行“读取-修改-写入”时,双循环就是你想要的。您从列表中读取一个值,修改它并使用列表的索引集运算符将其存储回列表中。

我知道您了解 List.filled,但对于其他读者,我将给出单行代码来创建初始化为 1 的二维数组值:

currentMap = new List.generate(height, (_) => new List.filled(width, 1));

关于arrays - List.forEach无法修改元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22210247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com