nim 语言实现迭代器
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 语言实现迭代器的更多相关文章
- Nim语言的模块化编程
前言 Nim支持把一大段程序分成若干个模块 一个模块就是一个源代码文件 每个模块都拥有它自己的名称空间 模块化可以起到封装(信息隐藏)和分步编译的作用 一个模块可以通过import语句获得另一个模块的 ...
- 学习Nim语言.rar(nim语言中文教程下载)
学习Nim语言 nim 语法上类似python ,是一门静态编译型语言,nim 使用空格缩进标示语句块的开始和结束, 喜欢python风格的程序员应该也会很容易适应和喜欢nim的风格. nim语言官方 ...
- Nim语言:Pascal的语法,Python的缩进
http://nim-lang.org/ 德国人Andreas Rumpf的作品,原因是他对过去使用的每种语言都不满意(Pascal也不满意?).以前叫Nimrod语言,从0.96版本开始改名为Nim ...
- 用Nim语言开发windows GUI图形界面程序
前言 本文得到了“樂師”的大力支持, 我们一起调试程序到深夜,要是没有他的帮忙, 我不知道要多久才能迈过这道坎, 另外“归心”还有其他人也提供了帮助, 他们都来自于QQ群:“Nim开发集中营”4693 ...
- Nim编码风格
介绍 Nim语言不限制开发人员使用哪种具体的编码风格, 但为了社区的发展,在编写一些标准库的时候还是应该遵从统一的编码风格 这篇文章会列出一系列的编码风格准则,供大家参考. 但值得注意的是,有很多例外 ...
- Nim教程【十四】
网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在sy ...
- Nim教程【五】
妈蛋,花了两天时间才搞定博客园的API, 比预期的时间整整多了1天, 不管怎么说,总算把博客园的客户端搞定了 这篇文章就是用博客园的客户端发布的, 先贴张图,给大家看看, 后面我会和博客园的领导商量一 ...
- Nim教程【二】
第一篇教程1秒内就被管理员从首页踢掉了 管理员嫌内容太少,没有含金量,这次多写一些. 这应该是国内第一个关于Nim入门的系列教程 好,闲话休提,言归正传 Nim介绍 Nim代码会编译成C语言的代码,再 ...
- nim的引用和指针
nim语言的引用和其他语言的指针有点相似 可以提供一种“多对一”的关系 这就意味着不同的引用可以指向同一个内存位置 nim区分可被追踪的引用和不可被追踪的引用 不可被追踪的引用又称为指针 可被追踪的引 ...
- Nim教程【十五】【完结】
模版 模版是Nim语言中的抽象语法树,它是一种简单的替换机制,在编译期被处理 这个特性使Nim语言可以和C语言很好的运行在一起 像调用一个方法一样调用一个模版 请看如下代码: template `!= ...
随机推荐
- Zabbix Server 5.0 安装及Zabbix5.2 一键部署脚本
zabbix 5.0 安装部署 1.关闭防火墙和selinux,安装repository源 [1]关闭防火墙,SELINUX firewall-cmd --state #查看默认防火墙状态,关闭后显示 ...
- Zabbix Agent 安装配置
1 介绍 zabbix([`zæbiks])是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活 ...
- ORACLE 分页排序后的数据重复或缺失问题
今天一大早业务人员就反映说用户导出的订单数据,有好几单是重复,并且缺失了某一单. 第一步:查询数据表.表里实际数据没有重复,也没有缺失.那么就可能是导出过程出错了(因为是异步分页导出,所以最先怀疑这部 ...
- 用python做时间序列预测八:Granger causality test(格兰杰因果检验)
如果想知道一个序列是否对预测另一个序列有用,可以用Granger causality test(格兰杰因果检验). Granger causality test的思想 如果使用时间序列X和Y的历史值来 ...
- YASKAWA安川机器人DX100轴控制基板维修解析知识
ASKAWA安川机器人DX100轴控制基板的维修是一项复杂而精细的工作,要求具备丰富的知识和实践经验.通过与子锐机器人维修联系,希望能企业提供一些有益的参考和帮助,在面对轴板故障时能够迅速准确地找到问 ...
- 推荐几款开源且免费的 .NET MAUI 组件库
前言 今天大姚给大家推荐 3 款开源且免费的 .NET MAUI 组件库. .NET MAUI介绍 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML ...
- docker - [05] 部署Nginx
题记部分 一.查找镜像 docker search nginx 二.拉取镜像 docker pull nginx 三.启动镜像 Nginx默认端口号为80,可以在启动时指定Nginx使用的端口号(例如 ...
- 关于我第二周学习kotlin这门语言
有关kotlin的知识点: 在学习lambda之前,我们先了解一下什么是lambda,简答来说就是一小段代码块,并且我们可以将这个代码块在函数之间传递,这是函数式编程的一个重要特性. 通常我们会需要一 ...
- phpstorm、goland常用快捷键
1) 文件操作相关的快捷键 快捷键 作用 Ctrl + E 打开最近浏览过的文件 Ctrl + N 快速打开某个 struct 结构体所在的文件 Ctrl + Shift + N 快速打开文件 Shi ...
- MAMP PRO教程
简单使用 第一步 创建新主机,按主机表左下角的"+"按钮. 第二步 配置域名和项目地址 第三步 选择你要使用的web服务器 第四步 配置URL重写规则 第五步 检查端口号 第六步 ...