Что такое итератор?

Итератор - это метод, который принимает блок или объект класса 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 {...}).

Вход для пользователей