本記事のサマリ
単純なkey->value(数値や文字列)などを管理しているHashに対して、mapを使って値を操作した結果を、配列ではなくHashにしたい場合、Ruby2.1以降ならto_hを使うとうまく表現できますよというお話。
対象読者
Hash#mapの結果をHashにしたいRubyistの皆様
動作確認バージョン
ruby --version
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin15]
経緯
Hashの全要素に対して、フォーマット変換かけたようなHashを作りたくなったので。
やってみた
例えば、key1〜key3で値が数値からなるHashがあり、それを全て5桁0埋めにしたいようなケースがあったとします。
その場合は、以下のように、Hashに対して、mapをかけた時に、mapに渡したブロックの戻りを[key,new_value]のような形(ここで、new_valueは、フォーマット変換などをして得られた新たな値にします。)で返し、それをto_hでhashにすると綺麗に書けます。
↓こんな感じ
hash = { key1: 1000, key2: 300, key3: 10000}
hash.map {|key,val| [key,val.to_s.rjust(5,'0')]}.to_h
{
:key1 => "01000",
:key2 => "00300",
:key3 => "10000"
}
地味に使うケースがありそうなので、備忘録として残します。