2011-08-26 47 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。

相關問題