1. ホーム
  2. ruby

[解決済み] Array#each vs. Array#map

2023-01-10 10:43:58

疑問点

hash = { "d" => [11, 22], "f" => [33, 44, 55] }

# case 1
hash.map {|k,vs| vs.map {|v| "#{k}:#{v}"}}.join(",")
=> "d:11,d:22,f:33,f:44,f:55"

# case 2
hash.map {|k,vs| vs.each {|v| "#{k}:#{v}"}}.join(",")
=> "11,22,33,44,55"

唯一の違いは、ケース1では vs.map で、ケース2が vs.each .

ここで何が起こったのか?

どのように解決するのですか?

Array#each は、配列の各要素に対して与えられたブロックを実行し、配列そのものを返します。

Array#map も配列の各要素に対して与えられたブロックを実行しますが、ブロックの各反復の戻り値を値とする新しい配列を返します。

例:このように定義された配列があるとします。

arr = ["tokyo", "london", "rio"]

次に each :

arr.each { |element| element.capitalize }
# => ["tokyo", "london", "rio"]

戻り値は単に同じ配列であることに注意してください。 の中のコードは each ブロック内のコードは実行されますが、計算された値は返されません。また、コードには副作用がないため、この例では有用な作業は行われません。

対照的に、配列の map メソッドを呼び出すと新しい配列が返され、その要素には map ブロックを実行する各ラウンドの戻り値を要素とする新しい配列を返します。

arr.map { |element| element.capitalize }
# => ["Tokyo", "London", "Rio"]