可能重複:
Ruby method Array#<< not updating the array in hash
Strange ruby behavior when using Hash.new([])Hash.new([])並不像預期的那樣
我一直在做Koans這是偉大的,當我去我發現沒有什麼大麻煩,但是我偶然發現了這一點,並且無法理解它:
def test_default_value_is_the_same_object
hash = Hash.new([])
hash[:one] << "uno"
hash[:two] << "dos"
assert_equal ["uno", "dos"], hash[:one] # But I only put "uno" for this key!
assert_equal ["uno", "dos"], hash[:two] # But I only put "dos" for this key!
assert_equal ["uno", "dos"], hash[:three] # I didn't shove anything for :three!
assert_equal true, hash[:one].object_id == hash[:two].object_id
end
所有的測試都通過了(我只是看着錯誤,這有助於我猜測正確的寫法)。
最後一個斷言,好吧,它們都沒有初始化,所以它們的值必須具有相同的對象ID,因爲它們都採用默認值。
我不明白爲什麼默認值被改變了,我甚至不完全確定發生了什麼。
我在IRB中試過了,也許在Hash/Array上有些篡改是爲了讓我瘋狂,但我得到了同樣的結果。
我首先想到hash[:one] << "uno"
意味着hash
變成{ one: ["uno] }
,但它仍然是{ }
。
雖然我猜<<
只要求push
,當你使用=
標誌
請告訴我,我錯過了新的密鑰只添加。
編輯:我使用Ruby 1.9.3
只有*一個*數組:在* new'方法被調用之前,值('[]')被計算*。嘗試使用塊的「默認形式」(每次創建/調用塊時創建一個* new *數組)。我相信這是一個重複.. – 2012-11-11 23:03:40
是的,被這個幾次被咬了:) –
@pst你能詳細說明嗎?我不確定我在追隨。我沒有在SO/Google/Duckduckgo中發現任何類似的問題,但我總是會錯過任何東西;) –