Что такое итератор?
Итератор - это метод, который принимает блок или объект класса Proc. В исходном файле блок располагается
непосредственно после вызова метода. Итераторы используются для определения пользовательских управляющих структур, особенно циклов.
Посмотрим на пример итератора. Итераторы часто используются для повторения какого-то действия для каждого элемента коллекции:
data = [1, 2, 3]
data.each do |i|
print i, "
"
end
Результат:
1 2 3
Блок do ... end передается методу each массива data и выполняется несколько раз. На каждый вызов в блок передается следующий элемент массива.
Вместо do...end можно использовать {...}
data = [1, 2, 3]
data.each { |i|
print i, "
"
}
Этот код работает так же, как и предыдущий пример. Тем не менее, в некоторых случаях приоритет операций может повлечь разное поведение do...end и {...}:
foobar a, b do .. end # foobar is the iterator.
foobar a, b { .. } # b is the iterator.
Причиной такого поведения является то, что {...} более тесно привязывается к предыдущему выражению, чем
do...end. Первый пример эквивалентен foobar(a, b) do..., а второй - foobar(a, b {...}).

Обсуждение
Re: Что такое итератор?
"
Есть разница?