ハッシュからサブハッシュを抽出するにはどうすればよいですか?
概要
ハッシュがあります:
h1 = {:a => :A, :b => :B, :c => :C, :d => :D}
このようなサブハッシュを抽出する最良の方法は何ですか?
h1.extract_subhash(:b, :d, :e, :f) # => {:b => :B, :d => :D}
h1 #=> {:a => :A, :c => :C}
解決策
ActiveSupport は、少なくとも 2.3.8 以降、4 つの便利なメソッド、#slice、#exc 、およびそれらの破壊的なメソッド、#slice! を提供しています。そして#以外!。それらは他の回答でも言及されていますが、それらを1か所にまとめると次のようになります。
x = {a: 1, b: 2, c: 3, d: 4}
# => {:a=>1, :b=>2, :c=>3, :d=>4}
x.slice(:a, :b)
# => {:a=>1, :b=>2}
x
# => {:a=>1, :b=>2, :c=>3, :d=>4}
x.except(:a, :b)
# => {:c=>3, :d=>4}
x
# => {:a=>1, :b=>2, :c=>3, :d=>4}
bang メソッドの戻り値に注目してください。既存のハッシュを調整するだけでなく、削除された (保持されていない) エントリも返します。ハッシュ#以外!質問に示されている例が最もよく当てはまります。
x = {a: 1, b: 2, c: 3, d: 4}
# => {:a=>1, :b=>2, :c=>3, :d=>4}
x.except!(:c, :d)
# => {:a=>1, :b=>2}
x
# => {:a=>1, :b=>2}
ActiveSupport は Rails 全体を必要とせず、非常に軽量です。実際、Rails 以外の多くの gem はこれに依存しているため、おそらくすでに Gemfile.lock に含まれているでしょう。 Hash クラスを独自に拡張する必要はありません。