Раздел «Язык Ruby».RubySchoolSourceL13:
<<Программирование на Ruby

Занятие 13: LazyEnumerable

Следующее занятие?
Предыдущее занятие

class Object
  def singleton_class
    (class<<self; self; end)
  end
end

class LazyEnumerable
  def initialize(enum)
    @enum = enum
  end
  
  def each(&block)
    @enum.each(&block)
  end

  def map!(&map_block)
    @enum = self.clone
    @map_block = map_block
    self.singleton_class.class_eval do
      def each(&output_block)
        @enum.each do |e|
          output_block[ @map_block[e] ]
        end
      end
    end
    self
  end

  include Enumerable
end

le = LazyEnumerable.new(1..10)
# le = (1..100)

le = le.map!{|i| puts "#{i}**2"; i**2}

le = le.map!{|i| puts "#{i} % 10"; i % 10}

puts "hi"

le.each{|i| puts "i=#{i}"}