Ruby on rails Ruby通过变量访问哈希值 让我们将其视为我们的哈希 c= {:test = > {:fo= >真} < /代码>
通常,如果我们想打印foo的值,我们会像这样访问散列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
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].