Spec-Zone.ru › Nim

system/iterators

SourceEdit

Итераторы по умолчанию для некоторых типов Nim.

Итераторы

iterator fieldPairs[S: tuple | object; T: tuple | object](x: S; y: T): tuple[
    key: string, a, b: RootObj] {.magic: "FieldPairs", noSideEffect, ...raises: [],
                                  tags: [], forbids: [].}
Итерирует по каждому полю x и y.
Предупреждение: Это фактически преобразует цикл 'for' и разворачивает его. Текущая реализация также содержит ошибку, которая влияет на связывание символов в теле цикла.

Пример:

type Foo = object
  x1: int
  x2: string
var a1 = Foo(x1: 12, x2: "abc")
var a2: Foo
for name, v1, v2 in fieldPairs(a1, a2):
  when name == "x2": v2 = v1
doAssert a2 == Foo(x1: 0, x2: "abc")
Source Edit
iterator fieldPairs[T: tuple | object](x: T): tuple[key: string, val: RootObj] {.
    magic: "FieldPairs", noSideEffect, ...raises: [], tags: [], forbids: [].}

Итерирует по каждому полю x, возвращая их имя и значение.

При итерации по объектам с различными типами полей необходимо использовать компиляционное время when вместо времени выполнения if, чтобы выбрать код, который нужно выполнить для каждого типа. Для выполнения сравнения используйте оператор is. Другой способ сделать то же самое без when — оставить задачу выбора соответствующего кода вторичной процедуре, которую вы перегружаете для каждого типа поля и передаёте ей value.

Предупреждение: Это фактически преобразует цикл 'for' и разворачивает его. Текущая реализация также содержит ошибку, которая влияет на связывание символов в теле цикла.

Пример:

type
  Custom = object
    foo: string
    bar: bool
proc `$`(x: Custom): string =
  result = "Custom:"
  for name, value in x.fieldPairs:
    when value is bool:
      result.add("\n\t" & name & " is " & $value)
    else:
      result.add("\n\t" & name & " '" & value & "'")
Source Edit
iterator fields[S: tuple | object; T: tuple | object](x: S; y: T): tuple[
    key: string, val: RootObj] {.magic: "Fields", noSideEffect, ...raises: [],
                                 tags: [], forbids: [].}
Итерирует по каждому полю x и y.
Предупреждение: Это фактически преобразует цикл 'for' и разворачивает его. Текущая реализация также содержит ошибку, которая влияет на связывание символов в теле цикла.

Пример:

var t1 = (1, "foo")
var t2 = default(typeof(t1))
for v1, v2 in fields(t1, t2): v2 = v1
doAssert t1 == t2
Source Edit
iterator fields[T: tuple | object](x: T): RootObj {.magic: "Fields",
    noSideEffect, ...raises: [], tags: [], forbids: [].}
Итерирует по каждому полю x.
Предупреждение: Это фактически преобразует цикл 'for' и разворачивает его. Текущая реализация также содержит ошибку, которая влияет на связывание символов в теле цикла.

Пример:

var t = (1, "foo")
for v in fields(t): v = default(typeof(v))
doAssert t == (0, "")
Source Edit
iterator items(a: cstring): char {.inline, ...raises: [], tags: [], forbids: [].}
Итерирует по каждому элементу a.

Пример:

from std/sequtils import toSeq
assert toSeq("abc\0def".cstring) == @['a', 'b', 'c']
assert toSeq("abc".cstring) == @['a', 'b', 'c']
Source Edit
iterator items(a: string): char {.inline, ...raises: [], tags: [], forbids: [].}
Итерирует по каждому элементу a. Source Edit
iterator items[IX, T](a: array[IX, T]): T {.inline.}
Итерирует по каждому элементу a. Source Edit
iterator items[T: char](a: openArray[T]): T {.inline.}
Итерирует по каждому элементу a. Source Edit
iterator items[T: enum and Ordinal](E: typedesc[T]): T
Итерирует по значениям E. См. также enumutils.items для перечислений с пропущенными значениями.

Пример:

type Goo = enum g0 = 2, g1, g2
from std/sequtils import toSeq
assert Goo.toSeq == [g0, g1, g2]
Source Edit
iterator items[T: not char](a: openArray[T]): lent2 T {.inline.}
Итерирует по каждому элементу a. Source Edit
iterator items[T: Ordinal](s: Slice[T]): T
Итерирует по срезу s, возвращая каждое значение между s.a и s.b (включительно). Source Edit
iterator items[T](a: seq[T]): lent2 T {.inline.}
Итерирует по каждому элементу a. Source Edit
iterator items[T](a: set[T]): T {.inline.}
Итерирует по каждому элементу a. items итерирует только по элементам, которые действительно находятся в множестве (а не по тем, которые множество может содержать). Source Edit
iterator mitems(a: var cstring): var char {.inline, ...raises: [], tags: [],
    forbids: [].}
Итерирует по каждому элементу a, позволяя изменять возвращаемое значение.

Пример:

from std/sugar import collect
var a = "abc\0def"
prepareMutation(a)
var b = a.cstring
let s = collect:
  for bi in mitems(b):
    if bi == 'b': bi = 'B'
    bi
assert s == @['a', 'B', 'c']
assert b == "aBc"
assert a == "aBc\0def"
Source Edit
iterator mitems(a: var string): var char {.inline, ...raises: [], tags: [],
    forbids: [].}
Итерирует по каждому элементу a, позволяя изменять возвращаемое значение. Source Edit
iterator mitems[IX, T](a: var array[IX, T]): var T {.inline.}
Итерирует по каждому элементу a, позволяя изменять возвращаемое значение. Source Edit
iterator mitems[T](a: var openArray[T]): var T {.inline.}
Итерирует по каждому элементу a, позволяя изменять возвращаемое значение. Source Edit
iterator mitems[T](a: var seq[T]): var T {.inline.}
Итерирует по каждому элементу a, позволяя изменять возвращаемое значение. Source Edit
iterator mpairs(a: var cstring): tuple[key: int, val: var char] {.inline,
    ...raises: [], tags: [], forbids: [].}
Итерирует по каждому элементу a. Возвращает (index, a[index]) пар. a[index] можно изменять. Source Edit
iterator mpairs(a: var string): tuple[key: int, val: var char] {.inline,
    ...raises: [], tags: [], forbids: [].}
Итерирует по каждому элементу a. Возвращает (index, a[index]) пар. a[index] можно изменять. Source Edit
iterator mpairs[IX, T](a: var array[IX, T]): tuple[key: IX, val: var T] {.inline.}
Итерирует по каждому элементу a. Возвращает (index, a[index]) пар. a[index] можно изменять. Source Edit
iterator mpairs[T](a: var openArray[T]): tuple[key: int, val: var T] {.inline.}
Итерирует по каждому элементу a. Возвращает (index, a[index]) пар. a[index] можно изменять. Source Edit
iterator mpairs[T](a: var seq[T]): tuple[key: int, val: var T] {.inline.}
Итерирует по каждому элементу a. Возвращает (index, a[index]) пар. a[index] можно изменять. Source Edit
END_OF_DOCUMENT_MARKER
iterator pairs(a: cstring): tuple[key: int, val: char] {.inline, ...raises: [],
    tags: [], forbids: [].}
Перебирает каждый элемент a. Возвращает пары (index, a[index]). Исходный код Редактировать
iterator pairs(a: string): tuple[key: int, val: char] {.inline, ...raises: [],
    tags: [], forbids: [].}
Перебирает каждый элемент a. Возвращает пары (index, a[index]). Исходный код Редактировать
iterator pairs[IX, T](a: array[IX, T]): tuple[key: IX, val: T] {.inline.}
Перебирает каждый элемент a. Возвращает пары (index, a[index]). Исходный код Редактировать
iterator pairs[T](a: openArray[T]): tuple[key: int, val: T] {.inline.}
Перебирает каждый элемент a. Возвращает пары (index, a[index]). Исходный код Редактировать
iterator pairs[T](a: seq[T]): tuple[key: int, val: T] {.inline.}
Перебирает каждый элемент a. Возвращает пары (index, a[index]). Исходный код Редактировать

© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/iterators.html

Spec-Zone.ru

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