Раздел «Язык Ruby».MyRange:

Пример реализации класса MyRange

Промежутки (экземпляры класса Range) отличаются от массивов (экземпляров класса Array). В отличие от массивов они не хранят в памяти все элементы, а хранят только первый и последний элемент промежутка. Для итерирования все элементов промежутка используется функция succ (successive element).

Попробуем самостоятельно повторить (хотя бы частично) функциональность Range:

class MyRange
  def initialize(l,r)
    @l = l
    @r = r
  end

  def each(&block)
    i = @l
    while i != @r
      block[i]
      i = i.succ
    end
    block[i]
  end

  def to_s
    "(#{@first_e}..#{@last_e})"
  end
  include Enumerable
end

r = MyRange.new(100,110)
r.each do |i|
  puts i
end
puts r.inject{|a,b| a+b} # 100+101+..+110

r = MyRange.new(4,20)
r.each {|x| puts x }

puts r.map{|x| x**2 }.join(',')

puts r.to_a.join(',')

puts r

Модуль Enumerable, который выступает здесь как примесь, предоставляет множество полезных методов типичных для всех контейнеров:

all?   any?   collect   detect   each_cons   each_slice   each_with_index   
entries   enum_cons   enum_slice   enum_with_index   find   find_all   grep
include?   inject   inject   map   max   member?   min   partition   reject
select   sort   sort_by   to_a   to_set   zip  

Примесь Enumerable использует метод each, который должен быть определен в вашем контейнере.