rubyのenumerator

2334 ワード

バージョンの変更により、1.8と1.9は多くの場所で異なり、APIは大きく変化し、理論的には1.9が良いが、現在多くのアプリケーションが1.8に基づいているため、windowsでrubyを遊ぶのはなおさらである.そのため、この2つのバージョン間のいくつかの違いに注意しなければならない.

class Enumerator
include Enumerable
.....

上記のコードから、1つのEnumeratorオブジェクトがEnumerableオブジェクトであることがわかります.ただし、EnumeratorはEnumerableとは目的が異なり、Enumeratorは他のオブジェクトを列挙することを目的としています.主な役割は2つあります.
一、Enumerableの代理オブジェクトとして.to_Enumなどは、可変のエージェントEnumeratorを返します.
Enumeratorオブジェクトを作成するのも簡単で、一般的にObjectのto_を使用します.Enumまたはenum_forメソッド.to_Enumは、列挙可能であるが可変ではないエージェントオブジェクトを返します.
データにインデックスを付けると、
1.8で

require 'enumerator'
foo.to_enum(:each_with_index).collect {|x,i| }

そのうちeach_with_indexは反復器法、すなわちeach_に基づくwith_indexの方法で反復します.
次のようにすることもできます.

require 'enumerator'
[1,2,3].enum_with_index.map{|x, i| }

本人機に装着されているのは1.8.7です.このバージョンにはenumeratorが内蔵されているので、require'enumerator'を使わずに実行できます.each_も含まれています.sliceも.
1.9:

#map
foo.collect.with_index {|x,i| }

2つのバージョンの使い方が異なるのは、1.8でcollectまたはmapがArrayオブジェクトを返し、1.9ではEnumeratorオブジェクトを返し、Enumeratorのみwith_indexメソッドは、1.8.7以前のバージョンではwith_がない可能性があります.indexですが、1.8.7にはwith_があります.indexメソッドの.次のコードは1.8.7と1.9.1で実行できます.

s="hi, how are you!"
s.each_char.with_index{ |args,arg| }

二、外部反復器として使用する.
Enumeratorには次の要素を返すためのnextメソッドがありますが、nextはありませんか?などの方法がありますので、StopIterator異常で判断する必要があります.1.9では(187でもいい)、Kernel.loopには暗黙的なrescue文が含まれており、このメソッドの内部にStopIterator例外が投げ出されると、ループは中止されます.次のようになります.

iterator = 9.downto(1);
loop do
print iterator.next
end

内部反復と外部反復について:
[quote]
1つの基本的な問題は、反復を制御する方法を決定することです.反復器自体ですか、反復器を使用する顧客コードですか.クライアントコードが反復を制御する場合、反復器は外部反復器と呼ばれ、逆に反復器が反復を制御する場合、反復器は内部反復器である.外部反復器を使用するクライアントコードは、遍歴プロセス全体を推進し、反復器から次の要素を明示的に取得する責任を負わなければなりません.対照的に、内部反復器を使用する場合、クライアントコードは、各要素に順次適用される内部反復器に操作を渡します.
外部反復器は内部反復器よりも柔軟です.たとえば、外部反復器を使用すると、2つの集合の同等性を容易に比較でき、内部反復器を使用すると不可能です.しかし、別の角度から見ると、内部反復器は反復論理を定義しているので、使用しやすいです.
Rubyでは、eachのような反復メソッドは、反復を制御し、メソッド呼び出しに関連付けられたコードブロックに値を「プッシュ」する内部反復メソッドである.Enumerator列挙器は、内部反復に使用できるeachメソッドを有するが、Ruby 1である.9以降のバージョンでは、外部反復器として機能し、クライアントコードはnextメソッドを使用して1つの列挙器から「値を取り出す」ことができます.
[/quote]