Когда выполняется перебор коллекции с for..in, поддерживаемым в Nim?

Документы для модуля множеств в Nim дают несколько примеров итерации по множеству через items метод:

var a = initOrderedSet[int]()
for value in [9, 2, 1, 5, 1, 8, 4, 2]:
  a.incl(value)
for value in a.items:
  echo "Got ", value
# --> Got 9
# --> Got 2
# --> Got 1
# --> Got 5
# --> Got 8
# --> Got 4

Однако в исходном коде наборов оказывается, что мы можем выполнять итерации по наборам напрямую, не вызывая items:

for item in s1:
  if item in s2: incl(result, item)

Это возможно, потому что есть items метод для наборов? Другими словами, если я хочу создать свою собственную коллекцию, мне нужно предоставить items реализация для поддержки итерации с for...in?

1 ответ

Решение

Это верно, вы даже можете создать items() Реализация итератора для типов, у которых его нет, что делает их итерируемыми самостоятельно. Вот пример для пользовательского типа объекта:

type
  MutableState = object
    value: int

iterator items(x: var MutableState): int =
  while x.value < 10:
    yield x.value
    x.value.inc

proc test() =
  var collection = MutableState()
  collection.value = 3
  for value in collection:
    echo "Value ", value

test()
Другие вопросы по тегам