Итерация блока в Ruby достаточно проста - он завершается чисто и переходит к остальной части кода.
Итерации с помощью Enumerator, с другой стороны, немного запутывают. Если вы звоните: каждый без блока, вместо этого возвращается Enumerator. Затем можно вызвать: next для перечислителя, чтобы получить каждое следующее итеративное значение.
И затем странная часть - когда итерация завершена, вместо перечислителя, возвращающего nil, выдается исключение: «итерация достигнута в конце» В результате он даже не возвращает значение.
Например:
test = [ 'test_value' ]
enumerator = test.each
enumerator.next
>> "test_value"
enumerator.next
>> StopIteration: iteration reached at end
Является ли причина этого просто для того, чтобы перечислитель мог вернуть значения nil? Ответ приходит ко мне только тогда, когда я отправляю это сообщение (поэтому я собираюсь опубликовать его до сих пор), но, похоже, это так.
Если это так, это типичный способ решения таких проблем? Кажется странным использовать Исключение для обработки кода, который, по сути, работает так, как ожидалось.