首先,您需要了解迭代一个哈希会给你。
考虑一下:
exp = {
fam: {cty: "bk", ins: 3},
spec: {cty: "man", ins: 2},
br: {cty: "qns", ins: 1},
aha: {cty: "man", ins: 0}
}
exp.map { |e, c, value| [e, c, value] }
# => [[:fam, {:cty=>"bk", :ins=>3}, nil], [:spec, {:cty=>"man", :ins=>2}, nil], [:br, {:cty=>"qns", :ins=>1}, nil], [:aha, {:cty=>"man", :ins=>0}, nil]]
这基本上是你在做什么,你循环和Ruby传递块的键/值对。你告诉Ruby给你e
中的当前哈希键,c
中的当前哈希值,并且由于没有其他东西被传入,value
参数变成nil
。
相反,你需要的关键块变量,一个是值:
exp.map { |k, v| [k, v] }
# => [[:fam, {:cty=>"bk", :ins=>3}], [:spec, {:cty=>"man", :ins=>2}], [:br, {:cty=>"qns", :ins=>1}], [:aha, {:cty=>"man", :ins=>0}]]
注意,零值都没有了。
重写你的代码考虑到这一点,再加上重构它简单:
exp = {
fam: {cty: 'bk', ins: 3},
spec: {cty: 'man', ins: 2},
br: {cty: 'qns', ins: 1},
aha: {cty: 'man', ins: 0}
}
exp.each do |k, v|
if v[:cty] == 'man'
puts k
end
end
# >> spec
# >> aha
现在它回到你想要的钥匙,所以就很容易抓住整个哈希。 select
是当你试图找到具体的事情要使用适当的方法:红宝石的
exp = {
fam: {cty: 'bk', ins: 3},
spec: {cty: 'man', ins: 2},
br: {cty: 'qns', ins: 1},
aha: {cty: 'man', ins: 0}
}
e = exp.select { |k, v| v[:cty] == 'man' }
# => {:spec=>{:cty=>"man", :ins=>2}, :aha=>{:cty=>"man", :ins=>0}}
旧版本并没有维持从哈希散列迭代器输出,所以我们不得不强制回哈希表:
e = exp.select { |k, v| v[:cty] == 'man' }.to_h
# => {:spec=>{:cty=>"man", :ins=>2}, :aha=>{:cty=>"man", :ins=>0}}
欢迎SO。我们不在乎你的经验水平是什么,只是向我们展示你的研究成果,并且已经为解决问题付出了很大的努力,然后写出一个很好的问题。请不要使用称呼,说话或签名; SO不是论坛,它是一个问题和答案的参考书。 –