読者です 読者をやめる 読者になる 読者になる

ActiveSupportのHash拡張

active_support/core_ext/hash/ 以下をざっとみてみた。

slice.rb

sliceは引数の要素を含むHashを返しslice!はオブジェクトごと書き換える。
extract!は引数のkeyを削除し、戻り値は削除したHash。

irb(main):001:0> require "active_support/core_ext/hash"
=> true
irb(main):002:0> hash = {a:1,b:2,c:3,d:4}
=> {:a=>1, :b=>2, :c=>3, :d=>4}
irb(main):003:0> hash.slice(:a, :c)
=> {:a=>1, :c=>3}
irb(main):004:0> hash
=> {:a=>1, :b=>2, :c=>3, :d=>4}
irb(main):005:0> hash.slice!(:a, :c)
=> {:b=>2, :d=>4}
irb(main):006:0> hash
=> {:a=>1, :c=>3}
irb(main):007:0> hash = {a:1,b:2,c:3,d:4}
=> {:a=>1, :b=>2, :c=>3, :d=>4}
irb(main):008:0> hash.extract!(:a, :c)
=> {:a=>1, :c=>3}
irb(main):009:0> hash
=> {:b=>2, :d=>4}
irb(main):010:0> 
diff.rb

Hash#diff(other)はotherと同じ要素と値のペアがあればそれを削除し、かつ
otherと同じkeyがあって値が違うものをmergeする。

irb(main):002:0> require "active_support/core_ext/hash/diff"
=> true
irb(main):003:0> hash = {a:1,b:2,c:3,d:4}
=> {:a=>1, :b=>2, :c=>3, :d=>4}
irb(main):004:0> hash.diff(a:1)
=> {:b=>2, :c=>3, :d=>4}
irb(main):005:0> hash.diff(a:3)
=> {:a=>1, :b=>2, :c=>3, :d=>4}
irb(main):006:0> hash.diff(a:3,c:3)
=> {:a=>1, :b=>2, :d=>4}
irb(main):007:0> 
except.rb

Hash#except(keys)とHash#except!(keys)を定義。exceptは自分をdupしてexcept!を呼ぶだけ。
Hashから引数のkeyを差し引いたものを返す。

irb(main):007:0> require "active_support/core_ext/hash/except"
=> true
irb(main):008:0> hash = {a:1,b:2,c:3,d:4}
=> {:a=>1, :b=>2, :c=>3, :d=>4}
irb(main):009:0> hash.except(:a, :c)
=> {:b=>2, :d=>4}
irb(main):010:0> hash
=> {:a=>1, :b=>2, :c=>3, :d=>4}
irb(main):011:0> hash.except!(:a, :c)
=> {:b=>2, :d=>4}
irb(main):012:0> hash
=> {:b=>2, :d=>4}
irb(main):013:0> 
keys.rb

Hashのkeyに関するメソッドが入っている。
Hash#transform_keys #=> block渡してkeyを処理する。
Hash#stringify_keys #=> keyを文字列にする
Hash#symbolize_keys #=> keyをシンボルにする
Hash#assert_valid_keys #=> keyを検証する
Hash#deep_transform_keys #=> block渡してkeyを処理する。
Hash#deep_stringify_keys #=> keyを文字列にする
Hash#deep_symbolize_keys #=> keyをシンボルにする

続きは次回