Ruby 使用数组中的键访问哈希

Ruby 使用数组中的键访问哈希,ruby,arrays,hash,ruby-1.8.7,Ruby,Arrays,Hash,Ruby 1.8.7,我有一个包含很多嵌套键值对的大散列。 例如 现在我想访问结果,我在数组中按正确的顺序设置了相应的键 keys_arr = ["foo", "bar", "hello", "world"] 动机很清楚,我想做以下几点: h["foo"]["bar"]["hello"]["world"] # => "result" 但我不知道怎么做。我目前正在做: key = '["' + keys_arr.join('"]["') + '"]' eval("h"+key) # => "resul

我有一个包含很多嵌套键值对的大散列。 例如

现在我想访问
结果
,我在数组中按正确的顺序设置了相应的键

keys_arr = ["foo", "bar", "hello", "world"]
动机很清楚,我想做以下几点:

h["foo"]["bar"]["hello"]["world"]
# => "result"
但我不知道怎么做。我目前正在做:

key = '["' +  keys_arr.join('"]["') + '"]'
eval("h"+key)
# => "result"
看起来像是黑客。而且,它大大降低了我在真实环境中使用哈希的能力

请建议其他更好的方法。

使用(或):


更新

如果您想执行以下操作:
h[“foo”][“bar”][“hello”][“world”]=“ruby”

将以另一种方式执行:

h = {"foo" => {"bar" => {"hello" => {"world" => 10 } } } }
keys = ["foo", "bar", "hello", "world"]

result = h

keys.each do |key|
  result = result[key]
end

puts result  #=>10
如果密钥可能不存在,请参见此处:


哇。。太容易了!!我想我问的是一个相当棘手的问题p两个问题:1>我仍然无法以
h[“foo”][“bar”][“hello”][“world”]
的身份访问它,因此如果我想操纵哈希,我将无法这样做。2> 它在操纵原始散列,而这不是所需的内容。@shivam,你说它在操纵原始散列是什么意思?除非您使用较旧版本的Ruby,否则它不会。如果是这种情况,请使用其他名称代替块中的
h
keys_arr.inject(h){x,k|x[k]}
@shivam,对于第一个问题,请尝试以下操作:
最内层=keys_arr[0…-1]。inject(h){x,k|x[k]};最里面的[keys_arr[-1]=“ruby”
最里面的
将引用最里面的散列对象)是的,你是对的。我正在使用ruby 1.8.7,并将名称更改为
x
确实解决了这个问题。谢谢
h = {"foo" => {"bar" => {"hello" => {"world" => "result" } } } }
keys_arr = ["foo", "bar", "hello", "world"]
keys_arr.inject(h) { |x, k| x[k] }
# => "result"
innermost = keys_arr[0...-1].inject(h) { |x, k| x[k] } # the innermost hash
innermost[keys_arr[-1]] = "ruby"
keys_arr.inject(h, :[])
h = {"foo" => {"bar" => {"hello" => {"world" => 10 } } } }
keys = ["foo", "bar", "hello", "world"]

result = h

keys.each do |key|
  result = result[key]
end

puts result  #=>10