Пример реализации класса 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
, который должен быть определен в вашем контейнере.