Итератор[A: A]
Итераторы генерируют серию значений, по одному значению за раз при каждом вызове next().
Итератор считается исчерпанным, как только его метод has_next() возвращает false. Таким образом, каждый вызов next() должен предваряться вызовом has_next() для проверки исчерпанности.
Использование
Учитывая правила использования итераторов, приведенные выше, базовый способ использования итератора выглядит следующим образом:
while iterator.has_next() do let elem = iterator.next()? // do something with elem end
Цикл For обеспечивает более лаконичный способ итерирования:
for elem in iterator do // do something with elem end
Итерация с использованием While более гибкая, поскольку позволяет продолжить итерацию, если вызов next() завершится ошибкой. Цикл For этого не допускает.
Реализация итераторов
Реализации итераторов должны соответствовать следующим правилам, чтобы считаться корректными:
- Если итератор исчерпан,
has_next()должен вернутьfalse. - После того, как
has_next()вернулfalse, ему запрещено возвращаться кtrue(если только итератор не поддерживает перемотку). -
has_next()не изменяет возвращаемое значение, еслиnext()не был вызван. Это означает, что между двумя вызовамиnext()любое количество вызововhas_next()должны возвращать то же самое значение (если только итератор не поддерживает перемотку). - Ошибка при вызове
next()не обязательно означает исчерпание.
Пример
// Generates values from `from` to 0
class ref Countdown is Iterator[USize]
var _cur: USize
var _has_next: Bool = true
new ref create(from: USize) =>
_cur = from
fun ref has_next(): Bool =>
_has_next
fun ref next(): USize =>
let elem = _cur = _cur - 1
if elem == 0 then
_has_next = false
end
elem
interface ref Iterator[A: A]
Общедоступные функции
has_next
Возвращает true, если этот итератор еще не исчерпан. Это означает, что значение, возвращенное последующим вызовом next(), является допустимой частью этого итератора.
Возвращает false, если этот итератор исчерпан.
Поведение next() после того, как эта функция вернула false, не определено, оно может выбросить ошибку или вернуть значения, которые не являются частью этого итератора.
fun ref has_next() : Bool val
Возвращаемое значение
- Булево значение
next
Генерирует следующее значение.
Это может завершиться ошибкой, что не обязательно означает исчерпание итератора.
fun ref next() : A ?
Возвращаемое значение
- Значение?
© 2016-2020, The Pony Developers
© 2014-2015, Causality Ltd.
Licensed under the BSD 2-Clause License.
https://stdlib.ponylang.io/builtin-Iterator