はちゅにっき

こっちのブログはまったり更新

Enumerable#each_with_object でハマった

[1, 2, 3].each_with_object(Array.new) do |i, memo|
  memo += [i, i * 2]
end
#  => [ ]

あれ!?

[[1, 2], [2, 4], [3, 6]]

になると思ったのに!?

qiita.com qiita.com

もうさんざん既出ですね! Enumerable#each_with_object は引数に対して破壊的な変更を加えなければダメなんですね。 つまり

[1, 2, 3].each_with_object(Array.new) do |i, memo|
  memo.push([i, i * 2])
end

のように破壊的なメソッドを利用すれば OK ですね。 もしくは今回のケースだと Enumerable#inject を利用して、以下のようにすれば OK ですね。

[1, 2, 3].inject(Array.new) do |memo, i|
  memo + [i, i * 2]
end

ハマったのでメモとして。