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[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 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 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 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