メモ
enum.each_with_object(object) {|item, memo| block }
each_with_indexメソッドは、要素を使って何らかのオブジェクトを操作するのに使います。要素の数だけブロックを繰り返し実行し、繰り返しごとにブロック引数itemには各要素を、memoには引数objectで指定したオブジェクトを入れます。戻り値は、objectのオブジェクトです。
https://ref.xaio.jp/ruby/classes/enumerable/each_with_object
サンプル
配列→配列
require "pp"
arr = [1, 2, 3]
result = arr.each_with_object([]) do |item, memo|
p item # => 1...
memo << 1
end
pp result # => [1, 1, 1]
result = arr.each_with_object([1, 2, 3]) do |item, memo|
memo << 1
end
pp result # => [1, 2, 3, 1, 1, 1]
result = arr.each_with_object([1, 2, 3]) do |item, memo|
memo << item + 1
end
pp result # => [1, 2, 3, 2, 3, 4]
ハッシュ→ハッシュ
hash = { a: "A", b: "B", c: "C" }
result = hash.each_with_object({}) do |item, memo|
p item # => [:a, "A"]...
p item.class # => Array
end
pp result # => {}
result = hash.each_with_object({}) do |(k, v), memo|
p k # => :a...
p v # => "A"...
end
pp result # => {}
result = hash.each_with_object({aaa: "AAA"}) do |(k, v), memo|
memo["#{k}XXX"] = "#{v}YYY"
end
pp result # => {:aaa=>"AAA", "aXXX"=>"AYYY", "bXXX"=>"BYYY", "cXXX"=>"CYYY"}
配列→ハッシュ
arr = [1, 2, 3]
result = arr.each_with_object({}) do |item, memo|
memo[item] = item + 1
end
pp result