我们将此视为哈希c = {:test => {:foo => true}}
通常,如果我们想打印foo的值,我们会像c[:test][:foo]
一样访问哈希,但我想基于我的变量动态访问它。
因此,让我们考虑以下变量path = [[:test],[:foo]]
。
如何立即访问值true?我试过了c[path]
,但它只是说nil
。我错过了什么?
答案 0 :(得分:3)
您可以使用dig
。您可以在此处查看挖掘文档Hash#dig
c = { :test => { :foo => true } }
c[:test][:foo]
#=> true
c.dig(:test, :foo)
#=> true
path = [:test, :foo]
c.dig(*path)
#=> true
您只需要传递层次结构
注意:
*
中path
之前的c.dig(*path)
被称为 splat operator
答案 1 :(得分:2)
旧的好的递归Ruby 1.9+解决方案:
hash = {:test => {:foo => true}}
path = [[:test],[:foo]]
path.flatten.reduce(hash) { |h, p| h[p] }
#⇒ true
或者,正如@Stefan在评论中所建议的那样:
path.reduce(hash) { |h, (p)| h[p] }
# or even
path.reduce(hash) { |h, p| h[p.first] }
更具防御性:
path.flatten.reduce(hash) { |h, p| h.nil? ? nil : h[p] }