の場合map、ブロック内にあるものを実行し、 とputs同じように実行eachしますが、puts ステートメントの戻り値を配列に収集し、それを結果として返します。その結果は役に立たないので、その場合に map を使用しても意味がありません。s の配列を取得しますnil。それぞれが結果を収集せずにブロック内の内容を実行します。
eachブロックを実行し、元の配列を返します。
> a = ["kevin","john","ryan"]
=> ["kevin", "john", "ryan"]
> a.each {|i| puts i.upcase}
KEVIN
JOHN
RYAN
=> ["kevin", "john", "ryan"]
>
mapブロックを実行し、ブロック内の値を配列で返します。
> a = ["kevin","john","ryan"]
=> ["kevin", "john", "ryan"]
> a.map {|i| puts i.upcase}
KEVIN
JOHN
RYAN
=> [nil, nil, nil]
>
nilそれぞれが a をputs返し、それらnilをmap収集したため、返された の配列に注意してください。大文字の文字列を配列に集めたい場合は、次のmapように適切に使用します。
> a.map {|i| i.upcase}
=> ['KEVIN', 'JOHN', 'RYAN']
または、同等に、a.map(&:upcase). 変数に代入することもできます:
> foo = a.map {|i| i.upcase}
=> ['KEVIN', 'JOHN', 'RYAN']
> foo
=> ['KEVIN', 'JOHN', 'RYAN']