ルビーでの動作の詳細を学んでおりeach
、次のコード行を試しました。
p [1,2,3,4,5].each { |element| el }
そして結果は配列です
[1,2,3,4,5]
しかし、私はその理由を完全に理解しているとは思いません。戻り値がeach
同じ配列なのはなぜですか? それぞれが反復するためのメソッドを提供するだけではありませんか? それとも、each
メソッドが元の値を返すのが一般的な方法ですか?
Array#each
呼び出された[array]オブジェクトを返します。ブロックの結果は破棄されます。したがって、元のアレイに厄介な副作用がなければ、何も変更されません。
おそらくあなたは使うつもりmap
ですか?
p [1,2,3,4,5].map { |i| i*i }
Array#eachのブロック形式は、元の Array オブジェクトを返します。ブロック内の配列の各要素で何かをしたい場合は、一般的に #each を使用します。例えば:
[1, 2, 3, 4, 5].each { |element| puts element }
これにより、各要素が出力されますが、元の配列が返されます。これは次の方法で確認できます。
array = [1, 2, 3, 4, 5]
array.each { |element| element }.object_id === array.object_id
=> true
新しい配列を返したい場合は、 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
。