Итераторы в Ruby — это методы, которые позволяют последовательно обрабатывать элементы коллекции (массивы, хэши, диапазоны) без явного использования циклов. В отличие от традиционных циклов, итераторы:
[1, 2, 3].each { |x| puts x * 2 }
# Вывод: 2, 4, 6
squares = [1, 2, 3].map { |x| x**2 }
# => [1, 4, 9]
evens = [1, 2, 3, 4].select(&:even?)
# => [2, 4]
sum = [1, 2, 3].reduce(0) { |acc, n| acc + n }
# => 6
Итераторы используют yield
для передачи управления в блок:
def my_each(array)
i = 0
while i < array.length
yield(array[i]) # Передаем элемент в блок
i += 1
end
array
end
my_each([1,2,3]) { |x| puts x }
def my_iterator
if block_given?
yield 42
else
puts "Блок не передан"
end
end
Без блока возвращается Enumerator:
enum = [1,2,3].each
enum.next # => 1
Пример итератора для диапазона чисел:
class NumericRange
def initialize(start, stop)
@start, @stop = start, stop
end
def each
current = @start
while current <= @stop
yield current
current += 1
end
end
end
range = NumericRange.new(1, 3)
range.each { |n| puts n }
(1..Float::INFINITY).lazy
.select(&:odd?)
.take(5)
.to_a
# => [1, 3, 5, 7, 9]
each
для перебораmap
для трансформацииselect
/reject
для фильтрацииreduce
для агрегацииyield
для передачи управления в блокblock_given?
для проверки