2

Michael Harrison은 lazy enumerators in Ruby에 대한 글을 올리며 lazy_selectlazy_map의 구현을 제공합니다. 다음 구현 lazy_flattenEnumeratorEnumerable 유형 이외의 특수 처리를 수행해야하는지 궁금합니다. 당신은 여전히 ​​아래 세 (비 지연) 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. Enumerable에 대해서는 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