k_R*_*ign 6 arrays foreach dart
我正在尝试创建一个列表列表来模仿 Dart 中二维数组的功能,但我在弄清楚如何使其工作时遇到了麻烦。
我最初List.forEach是为了创建列表并填充它们而使用的,但是在每次循环之后,就好像我从未创建过列表一样。下面是代码的样子:
currentMap = new List<List<int>>(height);
currentMap.forEach((e) {
e = new List<int>(width);
e.forEach((f) {
f = 1;
});
});
Run Code Online (Sandbox Code Playgroud)
打印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;
}
}
Run Code Online (Sandbox Code Playgroud)
这完全符合我的预期。
我知道这可能是一个非常基本的问题,我假设forEach不允许您修改元素,但我想对此进行一些确认,并且 Dart API 文档没有指定除了短语“apples the function f”每个元素......”这对我来说可能不太清楚。
另外,我知道List.filled()构造函数之类的东西——这就是我开始构建其他功能的方式。
编辑:好的,我想我现在明白了。参数是“传递共享”,这意味着对对象的引用进行了复制。这意味着您可以修改参数指向的可变对象的成员(如下所示):
void function(MyObject o) {
o.x = 5;
}
Run Code Online (Sandbox Code Playgroud)
但是尝试更改o指向的内容不会在退出函数后更改参数,例如:
void function(MyObject o) {
MyObject p = new MyObject();
o = p;
}
Run Code Online (Sandbox Code Playgroud)
Dart 没有变量引用,所有元素都作为对对象的引用传递,而不是对变量的引用。(换句话说,Dart 与 Java 和 JavaScript 一样纯粹是“共享调用”)。
这意味着回调的e参数forEach只是一个普通的局部变量,分配给它在回调之外没有任何影响。迭代器也是如此:它们返回可迭代对象中的值,但之后没有对可迭代对象的引用。
当您执行“读取-修改-写入”时,您想要的是双循环。您从列表中读取一个值,修改它并使用列表的索引集运算符将其存储回列表。
我知道你知道List.filled,但只是对于其他读者,我将给出单行代码来创建初始化为1值的二维数组:
currentMap = new List.generate(height, (_) => new List.filled(width, 1));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4974 次 |
| 最近记录: |