我想知道为什么map1无法像map2那样打印{a: 2, b: 3}
。
void main() {
Map<String, int> myMap1 = {"a": 1, "b": 2};
Map<String, int> myMap2 = {"a": 1, "b": 2};
print("before: $myMap1 , $myMap2"); // before: {a: 1, b: 2} , {a: 1, b: 2}
upgradeAndSetEqual(myMap1);
myMap2 = upgradeAndReturn(myMap2);
print(" after: $myMap1 , $myMap2"); // after: {a: 1, b: 2} , {a: 2, b: 3}
}
void upgradeAndSetEqual(Map<String, int> toUpgrade) {
toUpgrade = toUpgrade.map((key, val) {
val += 1;
return new MapEntry(key, val);
});
}
Map<String, int> upgradeAndReturn(Map<String, int> toUpgrade) {
return toUpgrade.map((key, val) {
val += 1;
return new MapEntry(key, val);
});
}
我尝试查找Dart是通过引用传递还是通过值传递,并找到了它。 https://groups.google.com/a/dartlang.org/forum/#!topic/misc/iP5TiJMW1F8/discussion
但是,我不明白为什么上一个示例似乎不起作用。
这是DartPad中的代码 https://dartpad.dartlang.org/452f15102a2c52d10ce28ff9ebe445b2
答案 0 :(得分:1)
.map(...)
创建了一个新地图,它不是在修改被调用的地图
void upgradeAndSetEqual(Map<String, int> toUpgrade) {
toUpgrade = toUpgrade.map((key, val) {
val += 1;
return new MapEntry(key, val);
});
}
toUpgrade = ...
无效,因为它是一个参数,更改其引用的内容不会更改其他引用。
如果将地图(或任何对象)作为参数传递,则引用(指针)将按值传递。该副本仍引用调用者通过的相同值实例。
这意味着更新toUpgrade
指向的内容,不会更改呼叫者网站上的引用。
答案 1 :(得分:0)
最好将Dart视为“按价值传递”,但副本要浅。更改传入的参数不会执行任何操作。但是,在原位使基础对象发生变异的参数上调用方法肯定可以更改原始值。