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()
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()