范性for语义以及pair和ipair的区别
详情参考 lua手册
1. 范性for语义
在了解pair和ipair前先简单了解下lua中的for循环,这里只阐述范性for循环的语义,范性 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。for的范式如下
for <var-list> in <exp-list> do
<body>
end
<var-list>是以一个或多个逗号分隔的变量名列表,<exp-list>是以一个或多个逗号分隔的表达式列表,通常情况下 exp-list 只有一个值:迭代函数的调用。
for k, v in pairs(t) do
print(k, v)
end
首先,初始化,计算 in 后面表达式的值,表达式应该返回范性 for 需要的三个值:迭代函数、状态常量、控制变量;与多值赋值一样,如果表达式返回的结果个数不足三个会自动用 nil 补足,多出部分会被忽略。
第二,将状态常量和控制变量作为参数调用迭代函数(注意:对于 for 结构来说,状态常量没有用处,仅仅在初始化时获取他的值并传递给迭代函数)。
第三,将迭代函数返回的值赋给变量列表。
第四,如果返回的第一个值为 nil 循环结束,否则执行循环体。
第五,回到第二步再次调用迭代函数。
2. ipair函数
无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。这种无状态迭代器的典型的简单的例子是 ipairs,他遍历数组的每一个元素。
a = {"one", "two", "three"}
for i, v in ipairs(a) do
print(i, v)
end
function iter (a, i)
i = i +
local v = a[i]
if v then
return i, v
end
end
function ipairs (a)
return iter, a,
end
在上面的代码中,ipairs函数返回三个值,迭代函数为iter,a为状态常量,控制变量的初始值为0,这三者由for语义保存,每次调用迭代函数iter返回表中的key和value,即 i 和 v 的值,可以看到,在pair中,只能遍历有数字索引的元素。如果出现如下图的情况,会无法遍历所有数字索引元素。

3. pair函数
ipair函数主要由lua的内置函数next实现,next原型大致为 next (table [, index])。它允许程序遍历表的所有字段。它的第一个参数是一个表,它的第二个参数是该表中的索引。 next返回表的下一个索引及其关联值。当使用nil作为其第二个参数调用时, next返回初始索引及其关联值。使用最后一个索引调用时,或者在空表中使用nil时, next返回nil。如果第二个参数不存在,则将其解释为nil。此外你可以使用next(t)检查表是否为空。pair有两种形式,如下。
function pairs (t)
return next, t, nil
end for k, v in next, t do
...
end
4. 总结
- 范性for语义是将for循环中 in 后面的表达式进行求值,获取到状态常量,迭代函数以及控制变量,然后将状态常量和控制变量传入迭代函数中求的key和value的值返回给for循环中的变量列表,直到第一个变量为nil时停止循环。其中状态常量通常指表,控制变量即遍历的步长。
- pair可以遍历一个table的所有元素,而ipair只能遍历数字索引的元素,此外,如果索引不是连续的ipair会无法遍历所有索引
- pair是由next函数实现的,next函数可以用来判断一个表是否为空, 即判断 next(t) == nil
范性for语义以及pair和ipair的区别的更多相关文章
- Lua table pair和ipair区别
官方描述: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the constru ...
- HTML5中最看重的理念“语义化”相比HTML有什么区别?
这里搜集整理了一些语义化标签方面的问题和解答,以供大家参考. 语义化这个概念应该说是伴着HTML5应运而生,那么什么是HTML5中所谓的语义化? 简单来说就是:描述内容的含义(meaning) 比如说 ...
- 语义化标签SEO
语义标签 title 和 h1 的区别,我的理解是: title 是整个网页的标题,突出整个网站的内容,H1 突出的是一篇文章的内容. b 与 strong 的区别,b只是样式的加粗,strong 是 ...
- Java并发编程原理与实战四十二:锁与volatile的内存语义
锁与volatile的内存语义 1.锁的内存语义 2.volatile内存语义 3.synchronized内存语义 4.Lock与synchronized的区别 5.ReentrantLock源码实 ...
- C++ pair的基本用法总结
1,pair的应用 pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存.另一个应用是,当一个函数需要返回2个数据的时候, ...
- Lua知识备忘录
最近对Lua很感兴趣,以下是本阶段学习的总结,包含三部分,一部分是基础语法,一部分是扩展和解释器嵌入,最后一部分是Lua小练习. 知识涉及:Lua语言编程基础:Lua&C++:Lua扩展.嵌入 ...
- 十一、C# 泛型
为了促进代码重用,尤其是算法的重用,C#支持一个名为泛型的特性. 泛型与模块类相似. 泛型使算法和模式只需要实现一交.而不必为每个类型都实现一次.在实例化的时候,传入相应的数据类型便可. 注:可空值类 ...
- C#泛型的抗变与协变
C#泛型的抗变与协变 学习自 C#本质论6.0 https://www.cnblogs.com/pugang/archive/2011/11/09/2242380.html Overview 一直以来 ...
- cs108 03 ( 调试, java通用性)
Debuger Great questions These questions will solve most bugs: what method shows the symptom ? what l ...
随机推荐
- Linux最小系统移植之早期打印CONFIG_EARLY_PRINTK
请先参考先前博文: Linux最小系统移植之早期打印CONFIG_DEBUG_LL , 因为eraly_printk其实就是对printch()封装的 一. 必要选项(在上面链接选中的前提下再新增 ...
- 【我们一起写框架】MVVM的WPF框架(四)—DataGrid
前言 这个框架写到这里,应该有很多同学发现,框架很多地方的细节,其实是违背了MVVM的设计逻辑的. 没错,它的确是违背了. 但为什么明知道违背设计逻辑,还要这样编写框架呢? 那是因为,我们编写的是框架 ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔i.MX RT系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2017年开始推出的i.MX RT系列开启了高性能MC ...
- 【憩园】C#并发编程之异步编程(三)
写在前面 本篇是异步编程系列的第三篇,本来计划第三篇的内容是介绍异步编程中常用的几个方法,但是前两篇写出来后,身边的朋友总是会有其他问题,所以决定再续写一篇,作为异步编程(一)和异步编程(二)的补 ...
- Web项目也能一键打包Android、IOS
随着移动互联网的不断发展,智能手机配置的不断提高,越来越多的年轻人基本都在使用手机,如微信.支付宝等等.已基本成为一种习惯,坐电梯也好.吃饭也好.开车也好,基本都捧着一个手机在那按来按去,开车就不建议 ...
- Pipenv项目化你的python应用
目录 Pipenv 什么是pipenv 安装pipenv pipenv用法 使用pipenv开发项目 pipenv 结合 pyenv Pipenv 什么是pipenv Pipenv is a prod ...
- informix存储过程笔记
一.存储过程概述 存储过程是一个用户定义的函数,由存储过程语句(SPL) 和一组SQL语句组成,以可以执行代码形式存储在数据库中,和表.视图.索引等一样,是数据库的一种对象. 存储过程语言SPL(St ...
- [Alibaba-ARouter] 简单好用的Android页面路由框架
开发一款App,总会遇到各种各样的需求和业务,这时候选择一个简单好用的轮子,就可以事半功倍 前言 Intent intent = new Intent(mContext, XxxActivity.cl ...
- 【English】十三、英语中的连词有哪些,都有什么作用
一.什么是连词 参考:https://m.hujiang.com/en_cixing/yylc/ 连词是一种虚词,用于连接单词.短语.从句或句子,在句子中不单独用作句子成分. 连词按其性质可分为并列连 ...
- linux_FTP连接失败
service vsftpd status vim /etc/vstpd/vsfptd.conf service vsftpd restart service iptables status serv ...