ruby - 将多个哈希值插入到ruby中的数组中

时间:2016-09-29 05:43:16

标签: arrays ruby hash

我想在一个数组中插入多个哈希值,这将创建一个哈希数组。但是每次我向数组添加一个新哈希时,它都会覆盖以前的哈希。知道发生了什么事吗?

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"}

我不确定为什么第一个哈希值会被覆盖。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:4)

您将相同的哈希保存在阵列的两个不同位置。将Ruby视为添加对象引用而不是每次将对象嵌入到另一个内容时复制对象。

使用不同的值执行此操作,您可能希望每次都创建一个新值:

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

为什么你可能想要将相同的东西放在数组中两次有合理的原因,这可能是一种在使用大型数据结构时节省内存的方法。

作为一个注释,Ruby倾向于强烈推荐变量名称,如part_array,全部为小写。同样,对于哈希键,符号通常是首选,因为它们在内部便宜。

答案 1 :(得分: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哈希。最后,您再次将partHash添加到partArray

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