首先,您需要了解迭代一個哈希會給你。
考慮一下:
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不是論壇,它是一個問題和答案的參考書。 –