Nim 何时支持使用 for..in 迭代集合?

When is iterating over a collection with for..in supported in Nim?

Nim 中 sets 模块的文档给出了一些通过 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 的迭代?

没错,您甚至可以在没有它的类型上创建 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()