ごく当たり前の話だとは思うのですけど、メモ。
h = { :hoge => 'hoge', :fuga => 'fuga' }
h.map { |k, v| v.upcase } # ["HOGE", "FUGA"]
HashにしたければHashに突っ込んでやればよい。
Hash[h.map { |k,v| [k,v.upcase] }] # {:hoge=>"HOGE", :fuga=>"FUGA"}
速度の計測したわけじゃないし普通はどんなやり方するのかわかんないけど、
とりあえずこれで解決した。
追記
会社の人に話を聞いてみると、Nabetaniさんが提示してくださった
def f(x); "SomeCalc[%s]"%x ; end
result = h.inject( {} ){ |a,(k,v)| a[k]=f(v);a }
# {:hoge=>"SomeCalc[HOGE]", :fuga=>"SomeCalc[FUGA]"}
が一般的らしいです。
追記
Ruby2.1以降、Array#to_h
が追加されました。
result = h.map { |k,v| [k,v.upcase] }.to_h
# {:hoge=>"HOGE", :fuga=>"FUGA"}
空のHashにinjectしていくよりも読みやすいと思います。