Nim中for..in遍历集合的支持场景及自定义集合迭代实现疑问
Nim中for..in遍历集合的相关问题解答
1. 何时支持用for..in遍历集合?
在Nim里,只要你的集合类型拥有对应的迭代器(默认是名为items的迭代器),就可以使用for..in语句来遍历它。
Nim的for..in语法本质是基于迭代器的——编译器会自动寻找目标类型的items迭代器(如果没有指定其他迭代器名称的话),并将for x in collection转换成for x in items(collection)的形式。
内置的集合类型(比如seq、array、HashSet、OrderedSet这些)都已经默认实现了items迭代器,所以你可以直接用for..in遍历它们。
2. 关于sets模块遍历的疑问,以及自定义集合的迭代支持
你观察得很准确!sets模块里的集合类型(比如HashSet)确实实现了items迭代器,这就是为什么你既可以像文档示例那样显式调用items方法遍历:
import sets var s = initHashSet[int]() s.incl(1,2,3) for x in s.items: echo x
也可以直接省略items,写成:
for x in s: echo x
因为编译器会自动帮你补全items迭代器的调用,把后者转换成前者的形式。
如果要自定义一个支持for..in遍历的集合类型,确实需要为它实现items迭代器。举个简单的例子,假设我们有一个自定义的整数集合:
type MyIntSet = object data: seq[int] proc items(s: MyIntSet): iterator(): int = result = iterator(): int = for x in s.data: yield x var mySet = MyIntSet(data: @[10,20,30]) for x in mySet: echo x # 会输出10、20、30
当然,你也可以实现其他命名的迭代器,比如reverseItems,然后通过for x in reverseItems(mySet)来反向遍历,但如果想要直接用for x in mySet的简洁写法,就必须实现items迭代器。
内容的提问来源于stack exchange,提问作者Imran
相关产品推荐
相关产品推荐

