Enumerable#lazy
#each
メソッドを提供する列挙型に依存しています。列挙型に#each
メソッドがない場合は、使用できません#lazy
。以外の列挙方法を柔軟に指定できるようになりKernel#enum_for
ました。#to_enum
#each
Kernel#enum_for(method = :each, *args)
しかし#enum_for
、友人は常に単純な (遅延のない) 列挙子を作成し、決してEnumerator::Lazy
.
Enumerator
Ruby 1.9.3 では、このような形式の #new が提供されていることがわかります。
Enumerator#new(obj, method = :each, *args)
残念ながら、そのコンストラクターは Ruby 2.0 で完全に削除されました。また、 でまったく利用できなかったと思いますEnumerator::Lazy
。したがって、遅延列挙子を返したいメソッドを持つクラスがある場合、そのクラスにない場合は、#each
を定義するヘルパークラスを定義する必要があるように思えます#each
。
たとえば、私はCalendar
クラスを持っています。すべての時間の最初からすべての日付を列挙することを提案することは、私にとって本当に意味がありません. アン#each
は役に立たないでしょう。代わりに、開始日から (遅延) 列挙するメソッドを提供します。
class Calendar
...
def each_from(first)
if block_given?
loop do
yield first if include?(first)
first += step
end
else
EachFrom.new(self, first).lazy
end
end
end
そして、そのEachFrom
クラスは次のようになります。
class EachFrom
include Enumerable
def initialize(cal, first)
@cal = cal
@first = first
end
def each
@cal.each_from(@first) do |yielder, *vals|
yield yielder, *vals
end
end
end
動作しますが重く感じます。Enumerator::Lazy
たぶん、廃止されたようなコンストラクターをサブクラス化して定義する必要がありますEnumerator
。どう思いますか?