LoginSignup
5
4

More than 5 years have passed since last update.

Enumerable.each_with_object の使い道

Posted at

同じ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のブロック引数の順番が覚えられないので備忘録ついでに書いたエントリです

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4