即使每个索引和键都是常量,打印也会更改值?

问题描述 投票:0回答:1
void main() {
  var count = 1;
  var a = {};

  exec(selectedOption) {
    if (count == 0) {
      print("NOTHING");
    } else {
      print("ELSE");
      a[1] = {};
      a[1]['values'] = [
        {
          "options": {},
        }
      ];
      a[1]['values'][0]['options'] = selectedOption['options'];
      count = 0;
    }
    print(a[1]['values'][0]['options']['selected']);
  }

  var b = {};
  b['options'] = {};
  b['options']['selected'] = 0;
  exec(b);
  b['options']['selected'] = 1;
  exec(b);
  b['options']['selected'] = 2;
  exec(b);
}

输出

ELSE
0
NOTHING
1
NOTHING
2

为什么a的值不断变化?第一次运行后,a 不应更改。我是对的还是我不适合编程?我正在使用 flutter 和 dart 2.12。我也尝试使用 Javascript,结果相同。

dictionary for-loop hashmap nested-lists
1个回答
0
投票

Dart 和 JavaScript 都以相同的方式处理映射(对象):通过引用而不是通过值。

那么当你第一次运行这条线时会发生什么?

a[1]['values'][0]['options'] = selectedOption['options'];

a[1]['values'][0]['options']
将持有 reference
b['options']
。并且由于您更改了
b['options']['selected']
,因此打印0、1和2是正常的。

如果你想复制

b
的当前值而不是引用,你需要这样做:

a[1]['values'][0]['options'] = Map.from(selectedOption['options']);

这将创建另一个地图实例而不是保存引用,并将产生您期望的结果。

注意:最好使用

a['1']
而不是
a[1]
,因为这是映射中的键,而不是索引为 1 的数组元素。

© www.soinside.com 2019 - 2024. All rights reserved.