QA@IT

RubyでHashの初期化をせずに配列の各要素へメソッドを適用させた値を受け取る

2819 PV

タイトルだとわかりにくいのですが、

def func(sym)
  "result_of_#{sym}"
end

h = {}
[:foo, :bar].each{|s| h[s] = func(s) }

のようなコードでHashに値を代入するときにループ前にh = {}と書かずに

h = [:foo, :bar].do_something

のような形でスッキリ書く方法はあるでしょうか?

回答

このような感じでしょうか。

h = [:foo, :bar].reduce({}) {|r, s| r[s] = func(s); r }
編集 履歴 (0)
  • `reduce`だとこういうふうに書けたのですね。`; r`と最後に返す処理を書いていなかったのでうまく動かせてませんでした。 -

reduce(=inject)でも出来ますけど、each_with_object がそのためのメソッドです。

 [:foo, :bar].each_with_object({}){|s,h| h[s]= func(s)}
編集 履歴 (1)
  • `each_with_object`というメソッドがあるんですね初めて知りました。勉強になります。 -

Ruby 2.1 以降であれば、Array#to_h を使って次のようにできます。

h = [:foo, :bar].map{|s| [s, func(s)]}.to_h
編集 履歴 (0)
  • ArrayをHash化できるようになったんですね。ありがとうございます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。