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" ...
随机推荐
- 锋利的jQuery——19个jQuery 常用片段整理
/** * Created by yu on 2016/11/20 0020. */// 1.禁用页面右键菜单$(function () { $(document).on('contextmenu', ...
- 快速入门系列--WebAPI--04在老版本MVC4下的调整
WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...
- JSON学习之二
1.JSON语法是JavaScript对象表示法的子集,语法规则: **数据在名称/值对中 **数据由逗号分隔 **花括号保存对象 **方括号保存数组 2.JSON名称/值对:JSON数据的书写格式是 ...
- C# List.ForEach 方法
C#中List.ForEach 方法是对 List 的每个元素执行指定操作. 示例: using System; using System.Collections.Generic; using Sys ...
- poj 2492A Bug's Life(并查集)
/* 目大意:输入一个数t,表示测试组数.然后每组第一行两个数字n,m,n表示有n只昆虫,编号从1—n,m表示下面要输入m行交配情况,每行两个整数,表示这两个编号的昆虫为异性,要交配. 要求统计交配过 ...
- 最近修改的几个小bug
最近修改的几个 bug,问题不大,查找起来却几番周折,汇总起来如下. 1.诡异电话号码 客服邮件反馈,很多用户服务热线变成了“0371-45875487”.看到这问题的第一反映是可能因为程序某个地方有 ...
- Cocos2d-x 3.2 学习笔记(十二)TimberMan!疯狂伐木工!
学习cocos2dx有一段时间了,试着做了2048游戏,最近又发现个经典游戏,啥也不说果断开工做自己的游戏——TimberMan! 首先说明:游戏资源摘自同类游戏,感谢这些游戏的资源让我完成自己的开发 ...
- Spring学习总结(一)——Spring实现IoC的多种方式
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...
- Android 自动补全提示输入AutoCompleteTextView、 MultiAutoCompleteTextView
以在搜索框搜索时,自动补全为例: 其中还涉及到一个词,Tokenizer:分词器,分解器. 上效果图: MainActivity.java: package com.joan.testautocoml ...
- 【Android】Android Camera实时数据采集及通过MediaCodec硬编码编码数据的流程
吐槽: 其实常用流程都差不多,但是有时候还是会忘记某一步的详细用法,但是各位朋友请注意,官方已经不推荐Camera类的使用(现在是android.hardware.camera2),但无奈公司项目之前 ...