11

reverseメソッドを使用せずにreverse_eachイテレータを使用して、 Enumerable(Arrayなど)を逆にしようとしています。

次のコードで十分だと思いました。

p [1,2,3].reverse_each {|v| v }

ただし、ブロックは逆順で配列を返しません。もちろん書くこともできます

[1,2,3].reverse_each {|v| p v }

でも、まずはアイテムを集めたいです。この動作のソースは何ですか?要件を満たすために式をどのように書く必要がありますか?

4

3 に答える 3

24

1.8.7以降、ブロックが指定されていない場合、Enumerable#each_*メソッドは列挙子を返すため、元々必須のメソッドを純粋な式で使用できるようになりました。

したがって、アイテムを収集する場合はEnumerable#map、その列挙子で使用します。

reversed_values = [1, 2, 3].reverse_each.map { |x| 2*x }
#=> [6, 4, 2]
于 2012-06-01T16:25:52.693 に答える
-1

別の方法は[1, 2, 3].reverse_each.to_a

于 2016-10-27T12:24:53.697 に答える
-1

(1..3).reverse_each {| v | pv}

生成:

1 2 3

一時配列を作成し、その配列を逆の順序でトラバースしますが、変換されたコレクションの逆コピーは返しません。

ブロックが指定されていない場合は、代わりに列挙子が返されます。

しかし、ルビーの地図法

列挙型の要素ごとに1回ブロックを実行した結果を含む新しい配列を返します。

p [1,2,3] .reverse_each.map {| v | v}

reverse_each-イテレータとして機能します

マップ-新しいコレクションのセットを形成します

于 2017-07-13T17:08:15.287 に答える