Ruby on rails Ruby通过变量访问哈希值 让我们将其视为我们的哈希 c= {:test = > {:fo= >真} < /代码>

Ruby on rails Ruby通过变量访问哈希值 让我们将其视为我们的哈希 c= {:test = > {:fo= >真} < /代码> ,ruby-on-rails,ruby,Ruby On Rails,Ruby,通常,如果我们想打印foo的值,我们会像这样访问散列c[:test][:foo],但我想根据我的变量动态访问它 因此,让我们考虑下面的变量路径= [[:Test],[:Fo] ] < /COD> < /P> 现在如何访问值true?我试过c[path],但它只是说nil。我缺少什么?你可以利用dig。你可以在这里查看挖掘文件 你只需要通过层次结构 注:在c.dig(*path)中*路径之前的被称为splat操作符 您可以使用dig。你可以在这里查看挖掘文件 你只需要通过层次结构 注:在c.dig

通常,如果我们想打印foo的值,我们会像这样访问散列
c[:test][:foo]
,但我想根据我的变量动态访问它

因此,让我们考虑下面的变量<代码>路径= [[:Test],[:Fo] ] < /COD> < /P>


现在如何访问值true?我试过
c[path]
,但它只是说
nil
。我缺少什么?

你可以利用
dig
。你可以在这里查看挖掘文件

你只需要通过层次结构

注:在
c.dig(*path)
*
路径之前的
被称为splat操作符


您可以使用
dig
。你可以在这里查看挖掘文件

你只需要通过层次结构

注:在
c.dig(*path)
*
路径之前的
被称为splat操作符


旧的良好递归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] }

旧的良好递归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] }

为什么你的
path
变量是嵌套数组?为什么你的
path
变量是嵌套数组?你可以通过
path避免
flatten
。reduce(hash){h,(p){h[p]}
你可以通过
path避免
flatten
。reduce(hash){h,(p)|h[p]
他们的
路径是
[:test],:foo]
,不是
[:test,:foo]
。这是一个可以更改的变量。如果输入值是
[:test],:foo]
,我们只需要添加
展平
,而不是
[:test],:foo]
,它们的
路径是
[:test],:foo]
。这是一个可以更改的变量。如果输入值是
[:test],:foo].