2011-08-26 46 views
0

为什么这些代码片段的行为不同?我以为他们应该做同样的事情...在数组中填充哈希行为不同使用“var”而不是:var - 为什么?

foo = {} 
    array = [] 

    foo['a'] = "1" 
    foo['b'] = "2" 

    array << foo 

    foo['a'] = "3" 
    foo['b'] = "4" 

    array << foo 

    output => [{"a"=>"3", "b"=>"4"}, {"a"=>"3", "b"=>"4"}] 

这不是我想要的。幸运的是,我尝试使用这种格式,它的工作原理:

foo = {} 
    array = [] 

    foo = { 
     :a => "1", 
     :b => "2" 
    } 

    array << foo 

    foo = { 
     :a => "3", 
     :b => "4" 
    } 

    array << foo 

    output => [{:a=>"1", :b=>"2"}, {:a=>"3", :b=>"4"}] 

这是怎么回事?

回答

4

这不是": - 那就是你在第一个例子修改foofoo[...]=...),而你在第二重新分配变量foofoo=...)。在第一示例中,仍然foo指的是相同的对象(这也是在阵列中)你把后的值3 & 4.

对于溶液,我建议第二个选项(可以与'使用/ "(字符串)或:(符号),或者您可以执行array << foo.clonefoo的副本压入阵列,因此进一步的修改不会改变它。

+0

谢谢;我总是会忘记那个done的.clone方法。 – MorningHacker

0

在你的第一个例子中,你将foo自己插入到数组中。当您在接下来的几行编辑foo时,您正在编辑刚刚推入阵列的相同散列!

在第二个示例中,您使用“{}”运算符显式设置foo为新散列。所以当你设置'a'和'b'的值时,你不会碰到已经推入数组的原始foo。

相关问题