【问题标题】:Dart reference to map not changing map飞镖参考地图不改变地图
【发布时间】:2018-10-01 19:20:19
【问题描述】:

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

【问题讨论】:

    标签: dart


    【解决方案1】:

    最好将 Dart 视为“按值传递”,但副本非常浅。改变传入的参数没有任何作用。但是在参数上调用方法来就地改变底层对象肯定会改变原始值。

    【讨论】:

      【解决方案2】:

      .map(...) 创建一个新地图,它不会修改调用它的地图

      void upgradeAndSetEqual(Map<String, int> toUpgrade) {
        toUpgrade = toUpgrade.map((key, val) {
          val += 1;
      
          return new MapEntry(key, val);
        });
      }
      

      toUpgrade = ... 无效,因为它是一个参数,更改它引用的内容不会改变其他引用。

      如果您将映射(或任何对象)作为参数传递,则引用(指针)按值传递。副本仍然引用调用者传递的相同值实例。 这意味着更新 toUpgrade 指向的内容不会更改调用方站点上的引用。

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 2022-11-15
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 2020-05-15
        • 1970-01-01
        相关资源
        最近更新 更多