Enumerable.each_with_object の使い道

  • 6
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

同じvalueを持つkeyがたくさんあるようなHashを初期化したいときに、
keyのArrayに対してinjectを使うと、
ブロックの最後でhashを返すのを忘れてしまってエラーになることが多いw

value = "xxx"
hash_keys = %[ key1 key2 key3 ]

hash = hash_keys.inject({}) do |_hash, key|
  _hash[key] = value
  _hash # これを忘れがち
end

だけど、each_with_objectを使うと忘れても大丈夫

hash = hash_keys.each_with_object({}) do |key, _hash|
  _hash[key] = value
end

ちなむと、破壊的メソッドで引数のオブジェクトを更新していくだけなので、
immutable なやつとかには使えないし、
文字列操作も普段使わないような破壊的なやつを使わないといけない。

ので、いまのところHashに同じ値を挿入するくらいしか使ったこと無い。

なお、以下のようなコードが一般的だろうがなんとなく好きではない。

hash = {}
hash_keys.each {|key| hash[key] = value }

※ ちなみにeach_with_objectのブロック引数の順番が覚えられないので備忘録ついでに書いたエントリです