Ruby通过变量访问哈希值

时间:2018-02-28 13:27:33

标签: ruby-on-rails ruby

我们将此视为哈希c = {:test => {:foo => true}}

通常,如果我们想打印foo的值,我们会像c[:test][:foo]一样访问哈希,但我想基于我的变量动态访问它。

因此,让我们考虑以下变量path = [[:test],[:foo]]

如何立即访问值true?我试过了c[path],但它只是说nil。我错过了什么?

2 个答案:

答案 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] }