我正在尝试编写一个函数,该函数在提供键数组时返回散列键的值(如果键不存在,则返回“nil”)。
考虑哈希:
my_hash = {
font_size: 10,
font_family: "Arial",
boo: {
name: 'blah'
}
}
Run Code Online (Sandbox Code Playgroud)
该方法的存根可能是:
def get_value(hash, array_of_keys)
...
end
Run Code Online (Sandbox Code Playgroud)
原因是我可以访问散列中可能实际上不存在的不同键。因此,例如,我想要 'blah',通常我会打电话,my_hash[:boo][:name]但它可能不存在或可能很深。我想要做的是拥有我的函数,我可以调用它,get_value(my_hash, [:boo, :name])以便我可以测试每个键是否存在(所以如果它们中的任何一个不存在,我就不会得到异常,以及在哪里无关紧要'深'的价值可能是)。
在我的情况下,检查我需要的每个值的存在是不可行的(我可能需要测试 10 个连续键的存在)我只需要一个函数,我可以说出我需要哪个值并获取该值(如果存在),并且如果不是,则为 nil(因此不会在尝试检索它时抛出异常)。
我试了一下,尝试使用一个递归函数,该函数每次循环时都会弹出数组中的第一个元素,但我无法练习如何返回我的值。
def get_value(val, arr)
if arr.count > 1
arr.each do |a|
get_value val[a], arr.pop
end
else
val[a]
end
end
get_value s, [:boo, :name]
Run Code Online (Sandbox Code Playgroud)
这是我的尝试(显然不起作用) - 谁能帮我解决这个问题,或者有一个可能更优雅的替代解决方案?几点:
[:font_size].inject(my_hash){|h, k| h.to_h[k]} #=> 10
[:boo, :name].inject(my_hash){|h, k| h.to_h[k]} #=> "blah"
[:boo, :foo].inject(my_hash){|h, k| h.to_h[k]} #=> nil
Run Code Online (Sandbox Code Playgroud)