我試圖創建一個列表列表來模仿Dart中的2D數組的功能,並且我一直在弄清楚如何使其工作。List.forEach無法修改元素?
我最初使用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;
}
好吧,讓我們看看我是否有這個權利:原始類型是傳遞值,對象是傳遞-參考。在我的forEach中,我爲每個元素創建一個列表,因爲這些列表是通過引用傳遞的對象,但內部循環不會修改這些值,因爲它們是整數。這聽起來是對的嗎?我非常感謝你的迴應。這很有道理。 –
飛鏢只通過引用沒有傳遞值。但是,在列表中沒有指向值的參考,e是參考的副本。您可以爲e分配一個新值,但這不會影響列表。 –
我欣賞所有的評論。你能解釋「參考」是什麼意思嗎?當我聽到我認爲類似於指針的東西時,所以我認爲原件會被修改,但顯然情況並非如此。 –