即,我怎么来自这个:
path = [ 1, 3, 4, 5 ... ]
到此:
my_array[1][3][4][5]...
path
数组的长度未知。
答案 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