dart - 映射值更改而不显式设置

时间:2014-10-15 11:23:59

标签: map dart

Dart问题: 在下面,为了显示(在我看来)"正常行为",键值对的值在没有明确设置的情况下不会改变:

Map<String,String> mup = {};
mup['a']='fred';
var val = mup['a'];// val==fred
val = 'joe'; 
print(mup); // (a: fred} - unchanged
mup['a']=val; //set
print(mup); // (a: joe} - changed OK

一种奇怪的方式来展示它,但没有什么令人惊讶的。 但如果值是列表,如果更改列表值,则会立即更新映射:

Map<String,List> mup = {};
mup['a']=[1,2,3,4,5,6];
var val = mup['a'];
val[1]=66;
print (mup);//{a: [1, 66, 3, 4, 5, 6]}

所以 mup 在没有明确更改的情况下发生了变化!发生了什么......拜托?

让我感到惊讶,但我一个初学者!

史蒂夫

2 个答案:

答案 0 :(得分:2)

var val = mup['a']会返回对列表[1,2,3,4,5,6]的引用,而不是副本 如果你修改它,它也会反映在地图内的列表中,实际上是同一个列表。

基本上你可以把它想象成在一个盒子里看同样的东西但是来自两个不同的洞。

答案 1 :(得分:0)

假设这种情况。

  1. 房间是地图。
  2. 你待在这个房间里。
  3. 你的包里有数字为1,2,3,4,5,6的卡片。
  4. 您将2号卡取出并放入(在您的包里)另一张编号为66的卡片。
  5. 你还在房间里。
  6. 请回答我: 你改变了房间吗?

    P.S。

    至少存在两种​​类型的检查相等。

    基本方法是完全相同的。

    这意味着如果某个类型的实例没有用户定义的运算符&#34; ==&#34;然后它总是通过参考进行比较。

    在您的情况下,您更改了List实例,但在Dart中List仅与引用进行了比较(因为它没有运算符&#34; ==&#34;)。

    达特地图也不能与他相提并论。

    但是,即使您尝试将地图与地图并排比较,也不会发现它们之间存在差异,因为Dart中的列表会通过引用进行比较。

    这意味着你同时是对的。

    一切都取决于你将如何比较实例。

    在不同情况下,您会得到不同的结果(观点)。