Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
171
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

Organization

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

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拡張のご紹介でした。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
171
Help us understand the problem. What are the problem?