LoginSignup
19
17

More than 5 years have passed since last update.

Rails4.2, ActiveSupportの新機能 Hash#transform_values を見てみた

Last updated at Posted at 2014-07-05

Rails 4.2.0.alphaのコミットログを眺めてたんだけど、せっかくだし理解を深めるためにもブログという形で書いておくことに。

Railsのmaster branchをインストールする

通常は安定バージョンのRailsをインストールすると思いますが、コードを読んだり試しに実行するのが目的なので、開発中の最新バージョンを入れたいです。

Gemfileに下記を記述してbundle installすると怒られました。

gem 'rails', github: 'rails/rails'
Could not find gem 'arel (~> 6.0.0) ruby', which is required by gem 'rails (>= 0) ruby', in any of the sources.

arelも最新バージョンを入れればいいっぽい。

# Gemfileに追記
gem 'arel', github: 'rails/arel'
$ bundle install

OKですね。無事2014/7/5時点最新の4.2.0.alphaが入りました。

$ rails -v
Rails 4.2.0.alpha

Hash#transform_valuesを試してみる

下記のコミットログ見てた。

Railsはコマンドライン実行が簡単だから助かる。メソッドのコメント通りに実行してみる。

$ rails c
{ a: 1, b: 2, c: 3 }.transform_values { |x| x * 2 }
#=> {:a=>2, :b=>4, :c=>6}

なるほど、全ての値に式を評価してその結果値を元の値と置き換えるわけか。実装もシンプルだった。見ればすぐわかる。

def transform_values(&block)
  result = self.class.new
  each do |key, value|
    result[key] = yield(value)
  end
  result
end

文字列の結合もイケる。

original = { a: 'a', b: 'b' }
original.transform_values { |v| v + '!' }
#=> {:a=>"a!", :b=>"b!"}

以前からあったHash#transform_keysの値版ということですね。

original.transform_keys { |k| k.upcase }
#=> {:A=>"a", :B=>"b"}

これってどんな時に使うんだろうか。便利だとは思うけど。

active_supportのcore_extensionsを見てると知らなかったのとかちょいちょいあって楽しいよ!
http://guides.rubyonrails.org/active_support_core_extensions.html#extensions-to-hash

19
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
17