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

More than 3 years have passed since last update.

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