Techioz Blog

ハッシュからサブハッシュを抽出するにはどうすればよいですか?

概要

ハッシュがあります:

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 クラスを独自に拡張する必要はありません。