ruby - 配列 - 各アレイと#アレイ




ruby 配列 (4)

副作用は同じで、リバースエンジニアリングに混乱を与えます。

はい、どちらも両方の配列を繰り返しEnumerable (実際には、 Enumerableで混ざっているものすべて)。しかし、 mapは元の配列を返すだけで、ブロック結果で構成されるArrayを返しEnumerable

eachの戻り値は元の配列にすぎず、Rubyコードではほとんど使用されませんが、 map最も重要な機能ツールの 1つです。

どのmapは、渡されたブロックまたは名前付きメソッドの結果を含む配列を返します。 例えば:

    2.2.3 :001 > [:how, :now, :brown, :cow].map &:to_s
 => ["how", "now", "brown", "cow"]

この場合、私はブロックを渡さなかっただけですが、 class Symbolオブジェクトはto_procメソッドを持っています。

[:how.to_s, :now.to_s, ...]

ところで、 MapEnumerableのメソッドであり、 Enumerableモジュールで必要な1つのメソッド)はArrayのメソッドなので、ドキュメントを見つけるのは難しいかもしれません。

トリビアノートとして: マップの実装は、 それぞれに基づいています

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使用しvs.each

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


.eachは最初に指定した配列と同じものを返します:

[1,2,3].each { |i| i + 1 }
#=> [1,2,3]

.mapは各ブロック呼び出しの結果から新しいArrayを返します:

[1,2,3].map { |i| i + 1 }
#=> [2,3,4]

ここでは、地図がそれぞれとどのように異なるかを簡単に説明します

a = ["a", "b", "c"];
#Array.map
p a.map {|item| "map_" + item}
#prints ["map_a", "map_b", "map_c"]

#Array.each
p a.each {|item| "map_" + item}
#prints ["a", "b", "c"]

このマップは["map_a", "map_b", "map_c"]返しますが、各マップは反復するだけで元の配列["a", "b", "c"]返します。

したがって、それぞれは配列の処理に使用され、マップは処理された配列で何かを行うために使用されます。


マップをハッシュに使用すると、暗黙的にハッシュが配列にキャストされるため、

[["d", [11, 22]], ["f", [33, 44, 55]]]

vs.each {...}は["d"、[11,22]]と[33、44、55]の[11,22]、["f" 33、44、55]]。 最後の参加の前に

[[11, 22], [33, 44, 55]]






enumerable