Rubyでeach
がどのように機能するかについての詳細を学び、次のコード行を試しました。
p [1,2,3,4,5].each { |element| el }
そして結果は次の配列です
[1,2,3,4,5]
しかし、その理由を完全には理解していないと思います。 each
の戻り値が同じ配列なのはなぜですか?それぞれが反復するための方法を提供するだけではありませんか?それとも、each
メソッドが元の値を返すのが一般的な方法ですか?
Array#each
は、呼び出された[array]オブジェクトを返します。ブロックの結果は破棄されます。したがって、元の配列にickyの副作用がない場合、何も変更されません。
おそらくあなたはmap
を使うつもりですか?
p [1,2,3,4,5].map { |i| i*i }
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
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を使用することをお勧めします。
すべてのメソッドは何かを返します。単なるnil
オブジェクトであっても、何かを返します。
nil
を返すのではなく、元のオブジェクトを返すこともできます。
何らかの理由で出力を抑制したい場合(たとえば、コンソールでのデバッグ)、これを実現する方法は次のとおりです。
[1,2,3,4,5].each do |nr|
puts nr.inspect
end;nil