这有点让人困惑。
如果您有一个包含更多哈希的散列,并且还有散列等等,那么如何确定一个成员是否存在一个以上的层深度?
例如:
hash 1 =
{
"layer1" =>
{
"layer2" =>
{
"layer3" => ['Something', 'Array']
}
}
}如果散列中只有:‘某事’,您将如何进行验证:
hash2 =
{
"layer1" =>
{
"layer2" => ['Other Array']
}
}例如,我会尝试这样做:
if hash2['layer1']['layer2']['layer3'].contains? 'Something'
puts "Found Something!"
end但这将错误未定义的方法“包含?”0:NilClass。其中layer3将是NilClass,因为它不存在。如果这些嵌入的散列中有一个是Nil,然后说它不存在就足够了,但是您不能轻易地测试它们的存在,因为如果您是一个太深的层,也会返回Nil。在ruby中是否有一个函数可以递归地检查每个顶层层的Nil,而不是当您调用.nil?时请求的特定成员,例如,我认为什么才能工作!
if hash2['layer1']['layer2']['layer3'].nil?
puts 'layer3 exists'
end但是.nil?只检查“layer3”是否存在。是否有从'layer1‘开始的方法,然后检查'layer2’是否存在,然后检查'layer3‘等等。在任何一个部分都是零,它返回假?因为如果'layer2‘或'layer1’不存在,它就会错误地使用未定义的方法‘[]’表示nil:NilClass。
发布于 2017-10-06 18:13:31
看看Hash#dig()。它接受一个键数组并递归地查找它们,如果其中任何一个丢失了,则返回nil。从医生那里:
h = { foo: {bar: {baz: 1}}}
h.dig(:foo, :bar, :baz) #=> 1
h.dig(:foo, :zot) #=> nil请注意,如果baz是nil,那么第一个dig调用将返回nil。因此,如果您知道不会将nils存储在哈希中,那么它只是检查嵌套密钥是否存在的替代方法。
发布于 2017-10-06 17:58:55
这不是最好的解决方案,但我写了这个:
h = {"layer1"=>
{"layer2"=>
{"layer3"=>["Something", "Array"]}
},
"layerx" => ["d"],
"layerz" => {"layera" => "deep"}
}
def vals(h)
return h if !h.is_a?(Hash)
h.values.map(&method(:vals)).flatten
end
vals(h) #=> ["Something", "Array", "d", "deep"]vals给出了嵌套在哈希-es内部的值。您可以检查元素是否在其中。
https://stackoverflow.com/questions/46609835
复制相似问题