Rails

ActiveSupportのHash拡張であるslice, exceptがびっくりするぐらい便利

More than 3 years have passed since last update.

ActiveSupportによる既存Rubyクラスの拡張は人間をダメにするんじゃないかと思いますが、知っていると周りのプログラマに差をつけられるテクニックが満載だと思います。今回はHashの拡張メソッドの話。


よくあるコード

some_hash = {

key_a: "some content",
key_b: "some content",
key_c: "some content"
}

# :key_aと:key_bを取り出したい
some_hash.select{|k, _| %i(key_a key_b).include? k} #=> {key_a: ..., key_b: ...}

# :key_cを除外したい
some_hash.reject{|k, _| k == :key_c} #=> {key_a: ..., key_b: ...}

いちいち「取り出したい」「除外したい」だけなのにブロックを使うのもおおげさな感じがします。


ActiveSupport拡張を使うと・・・

some_hash = {

key_a: "some content",
key_b: "some content",
key_c: "some content"
}

# :key_aと:key_bを取り出したい
some_hash.slice(:key_a, :key_b) #=> {key_a: ..., key_b: ...}

# :key_cを除外したい
some_hash.except(:key_c) #=> {key_a: ..., key_b: ...}

こんなにシンプルに書けちゃいます。!をつけると破壊的なメソッドになります。


その他の便利メソッド


compact

hash = { a: true, b: false, c: nil }

hash.compact # => { a: true, b: false }
hash # => { a: true, b: false, c: nil }


reverse_merge

options = options.reverse_merge(size: 25, velocity: 10)

# 以下のコードと等価
options = { size: 25, velocity: 10 }.merge(options)

以上、知っていると便利なActiveSupportによるHash拡張のご紹介でした。