Итерация блока в Ruby достаточно проста - это заканчивается чисто и продолжается на остальной части кода.
Итерация с Перечислителем, с другой стороны, немного более сбивает с толку. Если Вы звоните: каждый без блока, Перечислитель возвращается вместо этого.: затем может затем быть назван на Перечислителе для получения каждого следующего повторяющегося значения.
И затем нечетная часть - когда повторение завершено вместо ноля возврата Перечислителя, оно выдает исключение: "повторение достигнуто в конце". Результат состоит в том, что это даже не возвращает значение.
Например:
test = [ 'test_value' ]
enumerator = test.each
enumerator.next
>> "test_value"
enumerator.next
>> StopIteration: iteration reached at end
Состоит причина этого просто в том так, чтобы нулевые значения могли быть возвращены Перечислителем? Ответ происходит со мной только, поскольку я отправляю это (таким образом, я собираюсь отправить его все еще), но кажется, что он должен иметь место.
Если это так, действительно ли это - типичный способ обработать такие проблемы? Это кажется нечетным для использования Исключения для обработки кода, который по существу работает как ожидалось.
Вы правы, причина в том, что nil
может быть возвращено перечислителем как допустимое значение.Чтобы ответить на ваш вопрос о том, типично ли это, Python обрабатывает это таким же образом, используя исключение, также называемое StopIteration
.
>>> my_list = [1,2,3]
>>> i = iter(my_list)
>>> i.next()
1
>>> i.next()
2
>>> i.next()
3
>>> i.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Конечно, большую часть времени next
не вызывается напрямую (вместо этого используется каждый
или for
цикл)), поэтому этот базовый механизм не t выставлял это часто.
Да, nil по-прежнему является результатом, который отличается от отсутствия возвращаемого значения. По сути, это то же самое, что и попытка получить доступ к переменной или месту в памяти, которого там нет. Вот почему вам нужно исключение, а не возвращать ноль. Похоже, вы это догадались: -)