Перечислитель Ruby - почему конец за исключением?

Итерация блока в Ruby достаточно проста - это заканчивается чисто и продолжается на остальной части кода.

Итерация с Перечислителем, с другой стороны, немного более сбивает с толку. Если Вы звоните: каждый без блока, Перечислитель возвращается вместо этого.: затем может затем быть назван на Перечислителе для получения каждого следующего повторяющегося значения.

И затем нечетная часть - когда повторение завершено вместо ноля возврата Перечислителя, оно выдает исключение: "повторение достигнуто в конце". Результат состоит в том, что это даже не возвращает значение.

Например:

test = [ 'test_value' ]
enumerator = test.each
enumerator.next
>> "test_value"
enumerator.next
>> StopIteration: iteration reached at end

Состоит причина этого просто в том так, чтобы нулевые значения могли быть возвращены Перечислителем? Ответ происходит со мной только, поскольку я отправляю это (таким образом, я собираюсь отправить его все еще), но кажется, что он должен иметь место.

Если это так, действительно ли это - типичный способ обработать такие проблемы? Это кажется нечетным для использования Исключения для обработки кода, который по существу работает как ожидалось.

7
задан Asher 9 July 2010 в 12:27
поделиться

2 ответа

Вы правы, причина в том, что 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 выставлял это часто.

7
ответ дан 6 December 2019 в 22:59
поделиться

Да, nil по-прежнему является результатом, который отличается от отсутствия возвращаемого значения. По сути, это то же самое, что и попытка получить доступ к переменной или месту в памяти, которого там нет. Вот почему вам нужно исключение, а не возвращать ноль. Похоже, вы это догадались: -)

4
ответ дан 6 December 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: