You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:20:38