这有点令人困惑。
如果你有一个包含更多散列的散列,也有散列等等,你如何确定是否存在一个不止一层深的成员?
例如:
hash 1 =
{
"layer1" =>
{
"layer2" =>
{
"layer3" => ['Something', 'Array']
}
}
}
如果哈希只有,您将如何验证"Something">是否存在于上述哈希中
hash2 =
{
"layer1" =>
{
"layer2" => ['Other Array']
}
}
例如,我会尝试做:
if hash2['layer1']['layer2']['layer3'].contains? 'Something'
puts "Found Something!"
end
但这将导致未定义的方法"contains?"错误对于nil:NilClass。其中layer3将是NilClass,因为它不存在。如果这些嵌入的哈希中有一个是Nil,然后说它不存在就足够了,但你不能轻易地测试它们的存在,因为如果你的层太深,它也会返回Nil。ruby中是否有一个函数可以递归地检查每个顶层的Nil,而不是在调用.Nil时请求的特定成员例如,我认为可行
if hash2['layer1']['layer2']['layer3'].nil?
puts 'layer3 exists'
end
但是,零仅检查"layer3"是否存在。有没有一个方法从"第1层"开始,然后检查"第2层"是否存在,再检查"第3层",依此类推。在任何一个零的部分,它都返回false?因为如果"layer2"或"layer1"不存在,它会错误地说出nil:NilClass的未定义方法"[]"。
查看Hash#dig()
。它获取一个键数组,并递归地查找它们,如果其中任何一个丢失,则返回nil
。来自文档:
h = { foo: {bar: {baz: 1}}}
h.dig(:foo, :bar, :baz) #=> 1
h.dig(:foo, :zot) #=> nil
请注意,如果baz
是nil
,那么第一个dig
调用将返回nil
。因此,如果您知道您的散列中没有存储nil
,那么它只是检查嵌套密钥是否存在的一种替代方法。
不是最好的解决方案,但我写了这个:
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内部的值。你可以检查你的元素是否在里面。