-1

私はグーグルで、メソッドの実際の使用法を取得していませんmap。これが私のコンソールで試したことです。

a = ["kevin","john","ryan"]
a.each {|i| puts i.upcase}

上記は値をcapsで出力します。

a = ["kevin","john","ryan"]
a.map {|i| puts i.upcase}

これにより、値もcapsに出力されます。では、map メソッドの何が特別なのでしょうか? また、理解を深めるために、このトピックの優れた情報源を誰かに教えてもらえますか。

4

4 に答える 4

1
  • 印刷されるものは何でもputs、ブロックを評価することの副作用です。ブロック評価の副作用については、eachmap同じです。

  • 副作用 (一部のメソッドにはありません) に加えて、すべての Ruby メソッドには戻り値があります。eachとで異なるのは戻り値ですmap。前者はレシーバーを返し、後者はブロックの評価結果を返します。

    b = a.each{|i| puts i.upcase}
    b # => ["kevin","john","ryan"]
    
    b = a.map{|i| puts i.upcase}
    b # => ["KEVIN","JOHN","RYAN"]
    
于 2013-09-06T19:10:31.143 に答える
1

の場合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返し、それらnilmap収集したため、返された の配列に注意してください。大文字の文字列を配列に集めたい場合は、次の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']
于 2013-09-06T19:10:38.520 に答える
1

map(またはcollect) ブロックの出力を配列に収集します。

あなたの例はそれほど役に立ちません。ブロックはその副作用のためにのみ使用されます。

a.map { |i| i.upcase }または、より Ruby-y と比較しa.collect(&:upcase)ます。

 > a2 = a.collect(&:upcase)
=> ['KEVIN', 'JOHN', 'RYAN']

each単に呼び出された値 (この場合は元の配列) を返します。

次の出力がputs表示されていない場合:

 > a2 = a.each(&:upcase)
=> ['kevin', 'john', 'ryan']

の出力を収集するとputs、nil の配列が得られます。

 > a2 = a.collect { |i| puts i.upcase }
=> [nil, nil, nil]
于 2013-09-06T19:05:53.717 に答える