2

Michael Harrison在lazy enumerators in Ruby上有很棒的帖子,提供了lazy_selectlazy_map的實現。我想知道lazy_flatten的下列實現是否應該對EnumeratorEnumerable類型以外的任何其他類型進行特殊處理。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. 這似乎並不懶惰和我說話,你還在執行舊的(非延遲)flatten之下。
  2. EnumeratorEnumerable,所以我覺得你不需要單獨處理它。
  3. 我期望lazy_flatten是方法Enumerable

這是我將如何實現它:

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