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,结果相同。
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 的数组元素。