23

ルビーでの動作の詳細を学んでおりeach、次のコード行を試しました。

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

そして結果は配列です

[1,2,3,4,5]

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

4

4 に答える 4

27

Array#each呼び出された[array]オブジェクトを返します。ブロックの結果は破棄されます。したがって、元のアレイに厄介な副作用がなければ、何も変更されません。

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

p [1,2,3,4,5].map { |i| i*i }
于 2012-07-22T00:35:11.700 に答える
4

配列#ごと

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 を使用します。

于 2012-07-22T00:50:27.487 に答える
3

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

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

于 2012-07-23T23:13:56.073 に答える