2016-09-29 62 views
2

我想插入多個哈希到一個數組中,該數組將創建一個哈希數組。但是每次我向數組添加一個新的散列值時,它都會覆蓋之前的散列值。任何想法是怎麼回事?ruby​​ - 在ruby中插入多個哈希到陣列

partArray = [] 
partHash = {} 

partHash["name"] = "Item1" 
partHash["owner"] = "Item1" 

#Insert first hash into array 
partArray << partHash 
puts partArray 

#new set of key, value pairs 
#to be appended to array 
partHash["name"] = "Item2" 
partHash["owner"] = "Item2" 

#Append second hash into array 
partArray << partHash 

puts partArray 

輸出:

{"name"=>"Item1", "owner"=>"Item1"} 
new Array is : 
{"name"=>"Item2", "owner"=>"Item2"} 
{"name"=>"Item2", "owner"=>"Item2"} 

我不知道爲什麼在第一哈希值進行覆蓋。任何幫助表示讚賞。

+1

這也許會提供一些線索:'p partArray.map(:OBJECT_ID)' –

+0

得到相同的哈希OBJECT_ID,具有不同的值。 {「name」=>「Item1」,「owner」=>「Item1」} [70094101888900] new Array is: {「name」=>「Item2」,「owner」=>「Item2」} { 「name」=>「Item2」,「owner」=>「Item2」} [70094101888900,70094101888900] – danynl

回答

4

您正在將相同的散列保存在陣列的兩個不同位置。將Ruby想象成加入對象引用而不是在每次將它嵌套到另一個事物中時複製該對象。

做不同的值做到這一點,你可能需要創建一個新的每次:

part_array = [ ] 
part_array << { 
    # ... Hash entry 
} 

有合法的原因,你可能想要把同樣的事情在一個陣列的兩倍,也可能是一種在使用大型數據結構時節省內存的方法。

作爲一個說明,Ruby傾向於強烈推薦變量名稱如part_array,全部爲小寫。同樣,對於散列鍵,符號通常是首選,因爲它們在內部廉價。

+0

您的意思是每當我想添加一個新條目時,重新初始化數組和哈希值? – danynl

+0

只有哈希值,因爲每次插入它時都會改變它。如果你改變了數組,你只有一個數組,只有最後一個條目。 – tadman

+0

對,我做到了,它工作得很好。謝謝 – danynl

1

我不知道爲什麼第一個散列值被覆蓋?

首先我們定義一個空數組和一個空散列。

partArray = [] 
partHash = {} 

現在我們在哈希中創建兩個新的鍵值對。由於這些密鑰目前不存在於partHash之內,它們是爲您創建的。

partHash["name"] = "Item1" 
partHash["owner"] = "Item1" 
parthHash #{"name"=>"Item1", "owner"=>"Item1"} 

插入我們哈希到我們的數組:

partArray << partHash 
partArray #[{"name"=>"Item1", "owner"=>"Item1"}] 

這是關鍵的一步。由於密鑰"name""owner"已經存在於散列內,因此[]=表示法將簡單地重新定義任何現有值。

partHash["name"] = "Item2" 
partHash["owner"] = "Item2" 
partHash # {"name"=>"Item2", "owner"=>"Item2"} 
partArray #[{"name"=>"Item2", "owner"=>"Item2"}] 

目前partArray包含單個partsHash哈希值。最後,你追加partHashpartArray再次:

partArray << partHash 
partArray #[{"name"=>"Item2", "owner"=>"Item2"}, {"name"=>"Item2", "owner"=>"Item2"}] 
+0

是的,我明白髮生了什麼,並通過重新初始化散列來刪除舊條目來修復它。 – danynl