我有一个散列,其值与数组类型值配对,如下所示:
someHash={:key1=>[element1a,element1b],:key2=>[element2a,element2b]}
我试图遍历Hash,访问索引并修改Hash的数组类型值,如下所示:
hash.each_with_index{|(key,array),index|
element1,element2 = array
element1 = "new value"; element2="new value2"
}
hash
但是,当我返回哈希时,没有发生更新。对于我可以使用的数组(或不同的解决方法),是否存在类似map!
方法的哈希方法?
答案 0 :(得分:1)
您的代码只是为某些局部变量赋值。您需要将新值分配给哈希本身:
hash.each_with_index do |(key, array), index|
element1, element2 = array
element1 = "new value"
element2 = "new value2"
hash[key] = [element1, element2]
end
或更短(取决于您尝试实现的目标):
hash.each do |key, array|
hash[key] = ["new value", "new value2"]
end
或者:
hash.update(hash) do |key, array|
["new value", "new value2"]
end
答案 1 :(得分:0)
执行此操作时:
element1, element2 = array
您正在创建指向数组中元素的指针。当你稍后这样做时:
element1 = "new value"; element2="new value2"
您可以设置那些指向新值的指针,因此不会修改初始数组。
一个解决方案是:
hash.each_with_index do |(key,array),index|
array[0] = "new_value"
array[1] = "new value2"
end
hash
然而,我会做这样的事情:
hash.each do |key, array|
array[0] = "new_value"
array[1] = "new value2"
end
hash
答案 2 :(得分:0)
您不需要each_with_index。实际上,hash_不存在each_with_index(键是索引)。你可以这样做:
some_hash.each do |key, value|
value[0], value[1] = "new value", "new value2"
end
答案 3 :(得分:0)
代码中的问题是您只更改本地引用而不是数组中的值。
你可以这样使用map
:
new_hash = Hash[hash.map{|k,v| [k, ["new value","new value2"]]}]
这不会改变原始哈希值。