Spec-Zone.ru › Pony

Итератор[A: A]

[Source]

Итераторы генерируют серию значений, по одному значению за раз при каждом вызове 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

[Source]

Возвращает true, если этот итератор еще не исчерпан. Это означает, что значение, возвращенное последующим вызовом next(), является допустимой частью этого итератора.

Возвращает false, если этот итератор исчерпан.

Поведение next() после того, как эта функция вернула false, не определено, оно может выбросить ошибку или вернуть значения, которые не являются частью этого итератора.

fun ref has_next()
: Bool val

Возвращаемое значение

  • Булево значение

next

[Source]

Генерирует следующее значение.

Это может завершиться ошибкой, что не обязательно означает исчерпание итератора.

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API