2016-09-29 66 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