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をシンボルにする
続きは次回