2

Michael Harrison hat einen großen Beitrag auf lazy enumerators in Ruby, eine Implementierung von lazy_select und lazy_map. Ich frage mich, ob die folgende Implementierung von lazy_flatten spezielle Verarbeitung für etwas anderes als Enumerator und Enumerable Typen haben sollte.Ruby Enumerator-basierte Lazy Flatten-Methode

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 

Antwort

2
  1. Dies ist für mich nicht faul scheinen, wie Sie noch alte (nicht faul) unter flatten ausführen.
  2. Enumerator ist Enumerable, so denke ich, dass Sie nicht separat damit umgehen müssen.
  3. Ich würde erwarten, lazy_flatten auf Enumerable Methode sein.

Hier ist, wie ich es umsetzen würde:

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