提问人:Tushar Kulkarni 提问时间:3/7/2023 最后编辑:Tushar Kulkarni 更新时间:3/7/2023 访问量:15
即使每个索引和键都是恒定的,打印也会更改值?
Print changes values even though every index and key is constant?
问:
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 的价值会不断变化?首次运行后,不应更改。我是对的还是我不是为编程而生的?我正在使用 flutter 和 dart 2.12。我也尝试使用Javascript,结果相同。
答:
0赞
Peter Koltai
3/7/2023
#1
Dart 和 JavaScript 处理地图(对象)的方式相同:按引用而不是按值。
那么,当您在第一次运行时执行此行时会发生什么?
a[1]['values'][0]['options'] = selectedOption['options'];
a[1]['values'][0]['options']
将持有对 的引用。而且由于您更改了,因此打印 0、1 和 2 是正常的。b['options']
b['options']['selected']
如果要复制 的当前值而不是引用,则需要这样做:b
a[1]['values'][0]['options'] = Map.from(selectedOption['options']);
这将创建另一个映射实例,而不是保存引用,并将生成您预期的结果。
注意:最好不要这样做,因为这是映射中的键,而不是索引为 1 的数组元素。a['1']
a[1]
评论