Lua-泛型for循环 pairs和ipairs的区别
先看一段简单的代码:
local mytable = {
,
,
aa = "abc",
subtable = {},
,
}
--for循环1
print("for --- index")
for i=,#mytable do
print(i)
end
--for循环2
print("for ---- index-value")
for i,v in ipairs(mytable) do
print(i,v)
end
--for循环3
print("for ---- key-value")
for k,v in pairs(mytable) do
print(k,v)
end
输出结果:
for --- index for ---- index-value for ---- key-value subtable table: 0x7f82d8d07660
aa abc
3种for循环的结果各不相同,我们这里对后两种进行一下比较。
看一下,关于pairs和ipairs的定义:
pairs (t)If
thas a metamethod__pairs, calls it withtas argument and returns the first three results from the call.Otherwise, returns three values: the
nextfunction, the tablet, and nil, so that the constructionfor k,v in pairs(t) do body endwill iterate over all key–value pairs of table
t.See function
nextfor the caveats of modifying the table during its traversal.
- 如果table 含有元方法__pairs,返回它的前三个结果;
- 否则,返回函数next,table,nil;
- 会迭代table中所以键值对;
ipairs (t)
Returns three values (an iterator function, the table
t, and 0) so that the constructionfor i,v in ipairs(t) do body endwill iterate over the key–value pairs (
1,t[1]), (2,t[2]), ..., up to the first nil value.
- 返回一个迭代器函数,table,0;
- 会从key=1开始迭代table中的键值对,直到遇到第一个nil value;
例如:
local mytable2 = {
[] = "b",
[] = "c"
}
for i,v in ipairs(mytable2) do
print(i,v)
end
这里什么都不会输出,当迭代key=1的键值对时,value=nil,直接跳出;
所以:
- 使用pairs(t)会遍历所以key-value,但是它是无序的(不保证按照table元素的列举顺序遍历,和key的哈希值有关);
- 使用ipairs(t)会从key=1,2,3...这样的顺序遍历,保证顺序,不保证遍历完全;
所以要根据不同的需求,使用不同的方法。
Lua-泛型for循环 pairs和ipairs的区别的更多相关文章
- Lua中 pairs和ipairs的区别
Lua系列–pairs和ipairsLua中Table的存储方式在看二者的区别之前,我们首先来看一下Lua中的table是如何在内存中进行分配的.Table的组成:1.哈希表 用来存储Key-Valu ...
- pairs 和 ipairs 的区别
ipairs 在迭代过程中是会直接跳过所有手动设定key值的变量.pairs不会跳过手动设置key值的变量. 实例 tab = {,,a="cd","d"} f ...
- lua中pairs和ipairs的区别
标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (string.gmatch)等等.LUA手册中 ...
- Lua 中 pairs 和 ipairs 的区别
ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the construction ...
- lua中pairs 和 ipairs 的区别
1.table中存储值的时候,是按照顺序存储的,存储 k-v 的时候,是按照 k 的哈希值存储的. 2.ipairs --- 只能输出 table 中的值,并且不可输出nil,遇到 ni l就退出 p ...
- lua 中pairs 和 ipairs区别
lua 中pairs 和 ipairs区别 标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (s ...
- lua中for循环的四种遍历方式
lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3 key,value pairs 取每一 ...
- Lua中,泛型for循环遍历table时,ipairs和pairs的区别
为了看出两者的区别,首先定义一个table: a={"Hello","World";a=1,b=2,z=3,x=10,y=20;"Good" ...
- Lua 中pairs与ipairs区别
local tmp_tab = {}; tmp_tab[]="lua"; tmp_tab[]="hello" tmp_tab[]="aaa" ...
随机推荐
- VS2013模块对于SAFESEH映像是不安全的解决方法
常见报错:error LNK2026: 模块对于 SAFESEH 映像是不安全的 解决方法:右键打开项目属性 -> 链接器 -> 命令行 -> 其他选项 (D) 中加入 /SAFE ...
- 二分查找java代码
public int find(long searchKey){ int i; int begin = 0; int end = nElems - 1; while(true){ i = (begin ...
- PHP Log时时查看小工具
以前Log都是打印在一个文档中,然后打开文件夹,最后打开文档查看里面的内容,每次打开文件夹感觉很烦. 前些日子看到同事开发.NET的时候,用他自己的一个小工具能够时时查看到Log的内容,非常方便,所以 ...
- Windows 8(虚拟机环境)安装.NET Framework3.5(includes .NET 2.0 and 3.0)
按照这篇文章:http://blogs.technet.com/b/aviraj/archive/2012/08/04/windows-8-enable-net-framework-3-5-inclu ...
- [Matlab] tic toc
tic Start a stopwatch timer. tic and TOC functions work together to measure elapsed time. tic, ...
- JavaScript中{}+{}
在 JavaScript 中,加法的规则其实很简单,只有两种情况: 把数字和数字相加 把字符串和字符串相加 所有其他类型的值都会被自动转换成这两种类型的值. 为了能够弄明白这种隐式转换是如何进行的,我 ...
- go环境import cycle not allowed问题处理
1.前言 今天在搭建Go语言环境,从https://golang.org/dl/上下载一个Go语言环境.环境变量配置刚开始如下配置: GOROOT=/home/go/bin go执行文件目录 ...
- Azure ARM (10) ARM模式下的虚拟机和Classic Model虚拟机的区别
<Windows Azure Platform 系列文章目录> 本文内容比较多,请大家仔细阅读,谢谢! 请读者注意,在Azure ARM平台,有两种虚拟机模式:经典虚拟机和ARM虚拟机 A ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...
- jQuery的Ajax请求数据时type无法使用GET
写一个ASP.NET MVC例子,它是使用jQuery的$.Ajax来呼叫控制器的数据. 创建一个视图: 运行结果: 一切正常,但是本例子我们只是获取数据,并没有做任何数据POST上传至控制器,我们尝 ...