Lua-泛型for循环 pairs和ipairs的区别

先看一段简单的代码:

local mytable = {
    1,
    2,
    aa = "abc",
    subtable = {},
    4,
    6
}
--for循环1
print("for --- index")
for i=1,#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
1
2
3
4
for ---- index-value
1    1
2    2
3    4
4    6
for ---- key-value
1    1
2    2
3    4
4    6
subtable    table: 0x7f82d8d07660
aa    abc

3种for循环的结果各不相同,我们这里对后两种进行一下比较。

看一下,关于pairs和ipairs的定义:

pairs (t)

If t has a metamethod __pairs, calls it with t as argument and returns the first three results from the call.

Otherwise, returns three values: the next function, the table t, and nil, so that the construction

     for k,v in pairs(t) do body end

will iterate over all key–value pairs of table t.

See function next for the caveats of modifying the table during its traversal.

  1. 如果table 含有元方法__pairs,返回它的前三个结果;
  2. 否则,返回函数next,table,nil;
  3. 会迭代table中所以键值对;

ipairs (t)

Returns three values (an iterator function, the table t, and 0) so that the construction

     for i,v in ipairs(t) do body end

will iterate over the key–value pairs (1,t[1]), (2,t[2]), ..., up to the first nil value.

  1. 返回一个迭代器函数,table,0;
  2. 会从key=1开始迭代table中的键值对,直到遇到第一个nil value;

例如:

local mytable2 = {
    [2] = "b",
    [3] = "c"
}
for i,v in ipairs(mytable2) do
    print(i,v)
end

这里什么都不会输出,当迭代key=1的键值对时,value=nil,直接跳出;

所以:

  1. 使用pairs(t)会遍历所以key-value,但是它是无序的(不保证按照table元素的列举顺序遍历,和key的哈希值有关);
  2. 使用ipairs(t)会从key=1,2,3...这样的顺序遍历,保证顺序,不保证遍历完全;

所以要根据不同的需求,使用不同的方法。

时间: 2024-10-13 14:13:43

Lua-泛型for循环 pairs和ipairs的区别的相关文章

lua中pairs和ipairs的区别

主要在有key为整数的时候有区别. 注意数组默认的下标从1开始,比如a={"a","b","c","d"},和a={[1]="a",[2]="b",[3]="c",[4]="d"}是一样的. local a = { "a","b","c","d" } for k, v

lua中的pairs和ipairs区别

pairs Returns three values: the next function, the table t, and nil, so that the construction for k,v in pairs(t) do body end will iterate over all key–value pairs of table t. See function next for the caveats of modifying the table during its traver

Lua 中pairs和ipairs 区别

lua 中pairs 和 ipairs区别 标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (string.gmatch)等等.LUA手册中对与pairs,ipairs解释如下: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the construction for i,v

Lua泛型for

在学习Lua泛型for的过程中,我想实现ipairs的功能,写了如下代码: 1 function my_ipairs(table_name) 2 local i = 0 3 return function() i = i + 1;return i,table_name[i];end 4 end 5 6 for k,v in my_ipairs({2,3,5,6}) do 7 print (k,v) 8 end 结果死循环了.... 我很疑惑泛型for的工作过程是怎样的.查阅内容如下: 泛型for

lua中for循环的四种遍历方式

lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3 key,value pairs 取每一个键值对 ipairs 取从key==1开始的顺序整数最大值,每个键值对 参考http://rangercyh.blog.51cto.com/1444712/1032925 不过有一个问题, tbtest = { [1] = 1, [2] = 2, [4] = 4, } print(#(tbtest))

Lua中,泛型for循环遍历table时,ipairs和pairs的区别

为了看出两者的区别,首先定义一个table: a={"Hello","World";a=1,b=2,z=3,x=10,y=20;"Good","Bye"} 使用ipairs对其进行遍历: for i, v in ipairs(a) do print(v) end 输出的结果是: HelloWorldGoodBye 可见ipairs并不会输出table中存储的键值对,会跳过键值对,然后按顺序输出table中的值. 再使用pair

lua 中pairs 和 ipairs区别

ipairs 和pairs在lua中都是遍历tbale的函数但是两者有区别 1.pairs遍历table中的所有的key-vale 而ipairs会根据key的数值从1开始加1递增遍历对应的table[i]值 pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;但是ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出.它只能遍历到表中出现的第一个不是整数的key a = {[1] = "a1", [2] = "a2",

浅谈lua泛型for

在lua中我们要遍历一个tb,有序数组用ipairs,无序的则会用pairs(借助闭包性质来实现) 直接先上代码 --------------------------------- --数组型 --------------------------------- local tb1 = {3,2,1} for i,v in ipairs(tb1) do print(i,v) end ----------------------------------- --字典型 ----------------

lua序列化(支持循环引用)

lua序列化 支持key类型为string, number 支持value类型为string, number, table 支持循环引用 支持加密序列化 支持loadstring反序列化 使用示例 local t = { a = 1, b = 2} local g = { c = 3, d = 4, t} t.rt = g local ser_str = ser(g) local unser_table = loadstring(sered)() 原理详解 采用递归序列化表的方式实现,并且支持循