web-dev-qa-db-ja.com

map、each、collectの違いは何ですか?

Rubyでは、eachmap、およびcollectの機能に違いはありますか?

60
Rahul

eachmapおよびcollectとは異なりますが、mapcollectは同じです(技術的にはmapcollectのエイリアスですが、私の経験ではmapがより頻繁に使用されています)。

eachは、(Enumerable)レシーバーの各要素に対して囲まれたブロックを実行します。

[1,2,3,4].each {|n| puts n*2}
# Outputs:
# 2
# 4
# 6
# 8

mapおよびcollectは、レシーバーの各要素に適用されたブロックの結果を含む新しいArrayを生成します。

[1,2,3,4].map {|n| n*2}
# => [2,4,6,8]

Arraysで定義されているmap!/collect!もあります。レシーバーを変更します:

a = [1,2,3,4]
a.map {|n| n*2} # => [2,4,6,8]
puts a.inspect  # prints: "[1,2,3,4]"
a.map! {|n| n+1}
puts a.inspect  # prints: "[2,3,4,5]"
116
Chowlett

Eachはブロックを評価しますが、Eachブロックの評価の結果を破棄し、元の配列を返します。

irb(main):> [1,2,3].each {|x| x*2}
=> [1, 2, 3]

Map/collectは、配列内の各項目のブロックを呼び出した結果として構築された配列を返します。

irb(main):> [1,2,3].collect {|x| x*2}
=> [2, 4, 6]
23
RubyMiner