Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby使用数组tvalues索引哈希的嵌套哈希_Ruby - Fatal编程技术网

ruby使用数组tvalues索引哈希的嵌套哈希

ruby使用数组tvalues索引哈希的嵌套哈希,ruby,Ruby,在Ruby中,我想做这样的事情 我有一个像这样的散列 h = {1 => {2 => {3 => "three"}},'a' => { 'b' => { 'c' => "basd"}}} => {"a"=>{"b"=>{"c"=>"basd"}}, 1=>{2=>{3=>"three"}}} a = [1, 2, 3] 如果我有一个数组,它的值如下 h = {1 => {2 => {3 => "t

在Ruby中,我想做这样的事情

我有一个像这样的散列

h = {1 => {2 => {3 => "three"}},'a' => { 'b' => { 'c' => "basd"}}}
=> {"a"=>{"b"=>{"c"=>"basd"}}, 1=>{2=>{3=>"three"}}}
a = [1, 2, 3]
如果我有一个数组,它的值如下

h = {1 => {2 => {3 => "three"}},'a' => { 'b' => { 'c' => "basd"}}}
=> {"a"=>{"b"=>{"c"=>"basd"}}, 1=>{2=>{3=>"three"}}}
a = [1, 2, 3]
我想有一个方法,它将使用数组值来索引散列中的嵌套键,并返回最后一个键所指向的值(按照前面的数组/键的指导) 例如

如果a=['a','b','c']
则返回值应为
basd

如何做到这一点?

简单递归

def getValue(hash, keys, i = 0)
  if i + 1 < keys.length
    getValue(hash[keys[i]], keys, i + 1)
  else
    hash[keys[i]]
  end
end

getValue(h, [1,2,3]) => "three"
getValue(h, ['a','b','c']) => "basd"
def getValue(散列,键,i=0)
如果i+1“三”
getValue(h、['a'、'b'、'c'])=>basd
然后是:

keys.inject(hash, :fetch)
或者对于较早的Ruby版本:

keys.inject(hash) {|h, k| h[k]}
如果您确实想使用递归,则更为鲁比式的方法是:

def get_value(obj, keys)
  keys.empty? ? obj : get_value(obj[keys[0]], keys[1..-1])
end
Ruby 2.3.0在
散列
数组
上引入,完全解决了这个问题

如果在任何嵌套级别缺少元素,则返回
nil

h1 = {}
h2 = { a: {} }
h3 = { a: { b: {} } }
h4 = { a: { b: { c: 100 } } }

h1.dig(:a, :b, :c) # => nil
h2.dig(:a, :b, :c) # => nil
h3.dig(:a, :b, :c) # => nil
h4.dig(:a, :b, :c) # => 100

我的尝试有什么问题吗?irb(main):2552:0>h=>{“a”=>{“b”=>{“c”=>“basd”}},1=>{2=>{3=>“三”}}irb(main):2553:0>a=[1,2,3]=>[1,2,3]irb(main):2554:0>a.inject(h,:[])ArgumentError:2554:in
inject'from(irb):2554:inject:2554:inject(main):2555:a>argument inject:h(2代表1)发件人(irb):2555:in
inject'发件人(irb):2555@user2562153我从1.9.3开始使用Ruby。如果是这样的话,请使用megar解决方案。在Ruby的早期版本中,例如您的版本,inject需要一个块,因此您必须使用的形式是
keys.inject(hash){| h,k | h[k]}
Hi Peter,inject现在可以使用一个块。谢谢你的提示。Hi Priti,我从上面的inject操作中得到了“ArgumentError:arguments number of arguments(2对1)”。我的尝试或理解有什么错误吗?@user2562153关于你现在的
ruby
版本?ruby 1.8.6(2009-08-04 patchlevel 383)[x86\u 64-linux]嗨,Priti,我如何使用Ruby 1.8.6版实现同样的效果?请参阅对我答案的评论。