如何将值数组用作数组/散列路径?

时间:2017-02-03 14:56:44

标签: arrays ruby

即,我怎么来自这个:

path = [ 1, 3, 4, 5 ... ]

到此:

my_array[1][3][4][5]...

path数组的长度未知。

4 个答案:

答案 0 :(得分:8)

您可以像这样使用新的(Ruby 2.3)dig方法:

my_array.dig(1, 3, 4, 5)

或者传递你的splatted数组:

path = [1, 3, 4, 5]
my_array.dig(*path)

答案 1 :(得分:1)

您还可以将inject[]结合使用:

irb(main):001:0> arr = [[[[0, 1]]]]
=> [[[[0, 1]]]]
irb(main):002:0> [0, 0, 0, 1].inject(arr, :[])
=> 1

这递归'解包'与[]的arr,直到inject用完路径元素。

这不需要特定的版本(inject至少从Ruby 1.8开始就是Enumerable的一部分)但可能需要一个注释来解释正在发生的事情。

答案 2 :(得分:0)

绝对不是要走的路,只是为了好玩:

def build_path(array, path)
  eval "#{array}#{path.map { |el| "[#{el}]" }.join}"
end
build_path([1,2], [1])
#=> 2

答案 3 :(得分:0)

你的意思是自动生命吗?见http://t-a-w.blogspot.be/2006/07/autovivification-in-ruby.html

你可以这样做

def hash_tree
  Hash.new do |hash, key|
    hash[key] = hash_tree
  end
end

myhash = hash_tree 
myhash[1][2][3][4] = 5
myhash # {1=>{2=>{3=>{4=>5}}}}
myhash[1][2][3][4] # 5

或者您更喜欢博客中的示例

def autovivifying_hash
  Hash.new {|ht,k| ht[k] = autovivifying_hash}
end