飞镖对地图的引用未更改地图

时间:2018-10-01 19:20:20

标签: dart

我想知道为什么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

2 个答案:

答案 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视为“按价值传递”,但副本要浅。更改传入的参数不会执行任何操作。但是,在原位使基础对象发生变异的参数上调用方法肯定可以更改原始值。