Когда выполняется перебор коллекции с 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()