nim语言默认是支持 for x in items 这样的迭代的,而且一个类如果要支持迭代,可以用 yield 关键字,其实在 nim 主页上第二个例子就已经重点介绍了。

# Thanks to Nim's 'iterator' and 'yield' constructs,
# iterators are as easy to write as ordinary
# functions. They are compiled to inline loops.
iterator oddNumbers[Idx, T](a: array[Idx, T]): T =
for x in a:
if x mod 2 == 1:
yield x for odd in oddNumbers([3, 6, 9, 12, 15, 18]):
echo odd

但如果我的类希望像数组那样直接被迭代,而不是要调用一个方法,怎么办? 事实上,nim 语言提供了语法糖,如果你迭代的对象包含一个 items 方法,且返回的是 iterator,那么也可以的

# 让其支持直接的 for 迭代访问,默认情况下,如果 直接 for 一个变量,将默认调用他的items方法。
iterator items[E](this:SeqImmutableList[E]): E =
for x in this.elements:
yield x

这样你就可以直接迭代了:

let target = newSeqImmutableList(@[1,2,3,4])
for x in target:
echo x

如果要使用高级的特性,可以参考语言手册:  https://nim-lang.org/docs/manual.html#iterators-and-the-for-statement

比如,他就提到使用 pairs 这样的方法,实现字典需要迭代出两个参数的需求。

另外,还提到有两种迭代器,内联迭代器 和 闭包迭代器。

完整代码请参考:

type
# 定义一个新的别名,用来统一对大数据结构的索引访问。
idx = uint64 SeqImmutableList[E] = ref object
elements : seq[E] # 为 SeqImmutableList 定义了一个 size 属性
proc size*[E](this: SeqImmutableList[E]) : idx {.inline.} =
uint64(this.elements.len) #用到类型转换 # 定义一个可以直接使用 [] 方式访问的方法。
proc `[]`*[E](this: SeqImmutableList[E], index : idx) : E {.inline.} =
this.elements[int(index)] # 让其支持直接的 for 迭代访问,默认情况下,如果 直接 for 一个变量,将默认调用他的items方法。
iterator items[E](this:SeqImmutableList[E]): E =
for x in this.elements:
yield x # 相当于构造函数,只有构造函数才能访问私有变量。
proc newSeqImmutableList*[E](items : seq[E]) : SeqImmutableList[E] =
new(result)
result.elements = items let target = newSeqImmutableList(@[1,2,3,4])
echo "size = ", target.size
echo "target[2] = ", target[2]
for x in target:
echo x

nim 语言实现迭代器的更多相关文章

  1. Nim语言的模块化编程

    前言 Nim支持把一大段程序分成若干个模块 一个模块就是一个源代码文件 每个模块都拥有它自己的名称空间 模块化可以起到封装(信息隐藏)和分步编译的作用 一个模块可以通过import语句获得另一个模块的 ...

  2. 学习Nim语言.rar(nim语言中文教程下载)

    学习Nim语言 nim 语法上类似python ,是一门静态编译型语言,nim 使用空格缩进标示语句块的开始和结束, 喜欢python风格的程序员应该也会很容易适应和喜欢nim的风格. nim语言官方 ...

  3. Nim语言:Pascal的语法,Python的缩进

    http://nim-lang.org/ 德国人Andreas Rumpf的作品,原因是他对过去使用的每种语言都不满意(Pascal也不满意?).以前叫Nimrod语言,从0.96版本开始改名为Nim ...

  4. 用Nim语言开发windows GUI图形界面程序

    前言 本文得到了“樂師”的大力支持, 我们一起调试程序到深夜,要是没有他的帮忙, 我不知道要多久才能迈过这道坎, 另外“归心”还有其他人也提供了帮助, 他们都来自于QQ群:“Nim开发集中营”4693 ...

  5. Nim编码风格

    介绍 Nim语言不限制开发人员使用哪种具体的编码风格, 但为了社区的发展,在编写一些标准库的时候还是应该遵从统一的编码风格 这篇文章会列出一系列的编码风格准则,供大家参考. 但值得注意的是,有很多例外 ...

  6. Nim教程【十四】

    网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在sy ...

  7. Nim教程【五】

    妈蛋,花了两天时间才搞定博客园的API, 比预期的时间整整多了1天, 不管怎么说,总算把博客园的客户端搞定了 这篇文章就是用博客园的客户端发布的, 先贴张图,给大家看看, 后面我会和博客园的领导商量一 ...

  8. Nim教程【二】

    第一篇教程1秒内就被管理员从首页踢掉了 管理员嫌内容太少,没有含金量,这次多写一些. 这应该是国内第一个关于Nim入门的系列教程 好,闲话休提,言归正传 Nim介绍 Nim代码会编译成C语言的代码,再 ...

  9. nim的引用和指针

    nim语言的引用和其他语言的指针有点相似 可以提供一种“多对一”的关系 这就意味着不同的引用可以指向同一个内存位置 nim区分可被追踪的引用和不可被追踪的引用 不可被追踪的引用又称为指针 可被追踪的引 ...

  10. Nim教程【十五】【完结】

    模版 模版是Nim语言中的抽象语法树,它是一种简单的替换机制,在编译期被处理 这个特性使Nim语言可以和C语言很好的运行在一起 像调用一个方法一样调用一个模版 请看如下代码: template `!= ...

随机推荐

  1. Linux环境下安装phantomjs

    一.创建文件夹,用来存放软件 cd /opt/softWare mkdir  phantomJS cd phantomJS 二.下载并解压 wget https://bitbucket.org/ari ...

  2. centos 8 mysql 更改数据存储位置

    登录mysql后,先切换到myql数据库下通过show global variables like '%datadir%'; 可以查看数据默认的存储路径(一般在 /var/lib/mysql) 新建数 ...

  3. [MQ] Kafka

    概述: Kafka 安装指南 安装 on Windows Step1 安装 JDK JDK 安装后: 在"系统变量"中,找到 JAVA_HOME,如果没有则新建,将其值设置为 JD ...

  4. 发那科FANUC机器人M-710iC减速机维修看这几步

     发那科作为全球知名的工业机器人制造商,其M-710iC型号机器人在工业界享有盛誉.然而,即便是最顶尖的设备也难免会遇到维修问题,其中四轴传动齿轮箱的维修尤为关键.本文将深入探讨发那科FANUC机器人 ...

  5. 给Typecho加上心知天气-网页天气插件

    给你的博客添加个知心天气的天气预报,代码看下面 <!-- 知心天气--> <div id="tp-weather-widget" class="navb ...

  6. Pm2安装以及守护傻妞机器人进程教程

    本教程以centos7为例子,其他系统可自行替换 一.安装 1.安装nodejs yum install nodejs 2.安装pm2 cd /root && npm install ...

  7. Spark 保存本地josn格式文件运行报错 IDEA运行异常java.lang.NoClassDefFoundError: org/apache/spark/api/java/function/Function

    报错信息: java.lang.NoClassDefFoundError: org/apache/spark/api/java/function/Function at java.lang.Class ...

  8. ARC101E题解

    前言 此片题解大致按照笔者做题思路进行讲解. 简要题意 有一棵树,树上有偶数个节点.你需要给这些点两两配对,一组已经配对的点会将两点之间的树边进行一次覆盖.一组合法方案需要满足树上所有边都被覆盖至少一 ...

  9. Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南

    引言:AI技术新纪元的破局者 2025年3月6日凌晨,武汉Monica团队正式发布全球首款通用AI代理系统Manus,该工具在GitHub开源社区引发热议,单日Star数突破5万.与传统对话式AI不同 ...

  10. DeepSeek在M芯片Mac上本地化部署

    在 Mac 上使用 Ollama 运行 DeepSeek-R1,并通过 Open-WebUI 提供 Web 端访问. 1. 安装 Ollama Ollama官方:https://ollama.com/ ...