2

マイケル・ハリソンは、lazy enumerators in Rubyに関する素晴らしい投稿をしており、lazy_selectlazy_mapの実装を提供しています。 lazy_flattenの次の実装でEnumeratorEnumerableタイプ以外の特殊処理が必要かどうかは疑問です。あなたはまだ下に古い(非遅延)flattenを実行しているようRuby列挙型ベースの遅延平坦化メソッド

class Enumerator 

    def lazy_flatten 
    Enumerator.new do |yielder| 
     self.each do |value| 
     if value.kind_of? Enumerator 
      value.lazy_flatten.each do |v| 
      yielder.yield v 
      end 
     elsif value.kind_of? Enumerable 
      value.flatten.each do |v| 
      yielder.yield v 
      end 
     else 
      yielder.yield value 
     end 
     end 
    end 
    end 

end 

答えて

2
  1. これは、私には怠惰ないないようです。
  2. EnumeratorEnumerableですので、別途処理する必要はありません。
  3. lazy_flattenがメソッドになると思います。

は、ここで私はそれを実装する方法をです:

module Enumerable 
    def lazy_flatten 
    Enumerator.new do |yielder| 
     each do |element| 
     if element.is_a? Enumerable 
      element.lazy_flatten.each do |e| 
      yielder.yield(e) 
      end 
     else 
      yielder.yield(element) 
     end 
     end 
    end 
    end 
end 
関連する問題