簡體   English   中英

Dart Map 的奇怪行為

[英]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中的對象的副本,但實際上它是一個引用。 如果您打印abhashCode ,您可以看到它們實際上是同一個對象:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM