こんにちは、hachi8833です。
Web開発チームのtsunekawaさんに教えていただいた方法をメモします。
to_h
だけで配列をハッシュに変換できる
早速試してみましょう。
each_with_objectメソッドの場合
[["Alice", 50], ["Bob", 40], ["Charlie", 70]].each_with_object({}) do |(key, value), hash|
hash[key] = value
end
map.to_h
で書いた場合
[["Alice", 50], ["Bob", 40], ["Charlie", 70]].map.to_h
to_h
だけで書いた場合
[["Alice", 50], ["Bob", 40], ["Charlie", 70]].to_h
実行結果
確かに3つとも同じ結果になってますね。
#to_h
について
せっかくなので、「to_h
だけで書いた場合」で呼ばれているto_h
がどこにあるのかを確認してみましょう(参考: RubyのIRBやpryでメソッドの定義元をすっと調べる方法)。
to_h
だけで書いた場合
素のpryで実行していることからもおわかりのように、「to_h
だけで書いた場合」で呼ばれているのはRuby標準ライブラリのArray#to_h
でした。
なお、Array#to_h
が導入されたのはRuby 2.1.0からなので、意外と新しいんですね(参考: Ruby 2.1.0リリース!注目の新機能を見てみましょう)。
map.to_h
で書いた場合
順序が逆になりますが、map.to_h
の場合もついでに調べてみました。
予想どおり、こちらはRuby標準ライブラリのEnumerable#to_h
が呼ばれています。
今回のパターン「[["Alice", 50], ["Bob", 40], ["Charlie", 70]]
」では、Array#to_h
とEnumerable#to_h
は同じ結果になりましたが、レシーバーの内容によっては同じにならないかもしれません。
参考
たとえばRailsだとActive Support core_extにもXMLConverter#to_hがあり、実際にはXMLConverter#deep_to_h
を呼んでいます。
def to_h
deep_to_h(@xml)
end
ほかにもAction Controller(Action Pack内)のmetal/strong_parameters.rbにもParameters#to_h
があります。
def to_h
if permitted?
convert_parameters_to_hashes(@parameters, :to_h)
else
slice(*self.class.always_permitted_parameters).permit!.to_h
end
end
Rails環境では他にもさまざまなライブラリにto_h
があります。