[英]Weird behavior of Dart Map's
我期待最后的 c 作為
{a: {a: aA, b: aB}, b: {a: bA, b: bB}}
但它實際上變成了
{a: {a: bA, b: bB}, b: {a: bA, b: bB}}
飛鏢代碼:
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');
}
它的輸出:
i: a, j: a, b[j]:aA
i: a, j: b, b[j]:aB
{a: aA, b: aB}
{a: {a: aA, b: aB}}
i: b, j: a, b[j]:bA
i: b, j: b, b[j]:bB
{a: bA, b: bB}
{a: {a: bA, b: bB}, b: {a: bA, b: bB}}
final c is {a: {a: bA, b: bB}, b: {a: bA, b: bB}}
為什么會這樣?
在將b
映射插入c
映射后,您正在修改b
映射。 我認為誤解來自您認為它是您放入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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.