Dart 省道地图的怪异行为';s
我期待着最后的cDart 省道地图的怪异行为';s,dart,Dart,我期待着最后的c {a: {a: aA, b: aB}, b: {a: bA, b: bB}} 但它实际上变成了 {a: {a: bA, b: bB}, b: {a: bA, b: bB}} Dart代码: Map<String, String> a = { 'a' : 'A', 'b' : 'B', }; Map<String, String> b = {}; Map<String, Map<String, String>> c =
{a: {a: aA, b: aB}, b: {a: bA, b: bB}}
但它实际上变成了
{a: {a: bA, b: bB}, b: {a: bA, b: bB}}
Dart代码:
Map<String, String> a = {
'a' : 'A',
'b' : 'B',
};
Map<String, String> b = {};
Map<String, Map<String, String>> c = {};
void main() {
for (var i in a.keys){
for (var j in a.keys){
b[j] = i+a[j];
print('i: $i, j: $j, b[j]:${b[j]}');
}
print(b);
c[i] = b;
print(c);
}
print('final c is $c');
}
为什么会发生这种情况?将
b
映射插入c
映射后,您正在修改它。我认为误解是因为你认为它是你放在c
中的对象的副本,但实际上它是一个参考。如果打印a
和b
的hashCode
,您可以看到它们实际上是同一个对象:
print(c['a'].hashCode == c['b'].hashCode); // true
您真正想要的是为第一个循环的每次迭代使用一份b
,这样代码看起来像:
Map<String, String> a = {
'a': 'A',
'b': 'B',
};
Map<String, Map<String, String>> c = {};
void main() {
for (var i in a.keys) {
Map<String, String> b = {}; // <-- this is the fix
for (var j in a.keys) {
b[j] = i + a[j];
print('i: $i, j: $j, b[j]:${b[j]}');
}
print(b);
c[i] = b;
print(c);
}
print('final c is $c'); // {a: {a: aA, b: aB}, b: {a: bA, b: bB}}
print(c['a'].hashCode == c['b'].hashCode); // false
}
Map a={
‘a’:‘a’,
‘b’:‘b’,
};
映射c={};
void main(){
for(a.keys中的var i){
映射b={}//
Map<String, String> a = {
'a': 'A',
'b': 'B',
};
Map<String, Map<String, String>> c = {};
void main() {
for (var i in a.keys) {
Map<String, String> b = {}; // <-- this is the fix
for (var j in a.keys) {
b[j] = i + a[j];
print('i: $i, j: $j, b[j]:${b[j]}');
}
print(b);
c[i] = b;
print(c);
}
print('final c is $c'); // {a: {a: aA, b: aB}, b: {a: bA, b: bB}}
print(c['a'].hashCode == c['b'].hashCode); // false
}