web-dev-qa-db-ja.com

Array#eachが同じ要素を持つ配列を返すのはなぜですか?

Rubyでeachがどのように機能するかについての詳細を学び、次のコード行を試しました。

p [1,2,3,4,5].each { |element| el }

そして結果は次の配列です

[1,2,3,4,5]

しかし、その理由を完全には理解していないと思います。 eachの戻り値が同じ配列なのはなぜですか?それぞれが反復するための方法を提供するだけではありませんか?それとも、eachメソッドが元の値を返すのが一般的な方法ですか?

22
Jeff Storey

Array#each は、呼び出された[array]オブジェクトを返します。ブロックの結果は破棄されます。したがって、元の配列にickyの副作用がない場合、何も変更されません。

おそらくあなたはmapを使うつもりですか?

p [1,2,3,4,5].map { |i| i*i }
25
user166390

Array#each

Array#each のブロック形式は、元のArrayオブジェクトを返します。通常、ブロック内の配列の各要素で何かをdoしたい場合は、#eachを使用します。例えば:

[1, 2, 3, 4, 5].each { |element| puts element }

これにより、各要素が出力されますが、original配列が返されます。これは次の方法で確認できます。

array = [1, 2, 3, 4, 5]
array.each { |element| element }.object_id === array.object_id
=> true

Array#map

new配列を返したい場合は、 Array#map またはその同義語の1つを使用します。 #mapのブロック形式は、別のArrayオブジェクトを返します。例えば:

array.object_id
=> 25659920
array.map { |element| element }.object_id
=> 20546920
array.map { |element| element }.object_id === array.object_id
=> false

通常、元の配列を変更せずに、元の配列の変更バージョンを操作する場合は、#mapを使用することをお勧めします。

3
Todd A. Jacobs

すべてのメソッドは何かを返します。単なるnilオブジェクトであっても、何かを返します。

nilを返すのではなく、元のオブジェクトを返すこともできます。

2
Andrew Grimm

何らかの理由で出力を抑制したい場合(たとえば、コンソールでのデバッグ)、これを実現する方法は次のとおりです。

  [1,2,3,4,5].each do |nr|
    puts nr.inspect
  end;nil
1
Markus Andreas