Lua 中 pairs 和 ipairs 的区别

官方文档上的说明:

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 pairs (1,t[1]), (2,t[2]), ···, up to the first integer key absent from the table.

pairs (t)

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.

这样就可以看出 ipairs以及pairs 的不同。pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;但是ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key

下面举个例子

代码如下:

local tabFiles = {  
[3] = "test2",  
[6] = "test3",  
[4] = "test1" 
}  
for k, v in ipairs(tabFiles) do 
    print(k, v)  
end

猜测它的输出结果是什么呢?根据刚才的分析,它在 ipairs(tabFiles) 遍历中,当key=1时候value就是nil,所以直接跳出循环不输出任何值。

代码如下:

>lua -e "io.stdout:setvbuf 'no'" "test.lua" 
>Exit code: 0

那么,如果是

代码如下:

for k, v in pairs(tabFiles) do 
    print(k, v)  
end

则会输出所有:

代码如下:

>lua -e "io.stdout:setvbuf 'no'" "test.lua"   
3 test2  
6 test3  
4 test1  
>Exit code: 0

现在改变一下表内容:

代码如下:

local tabFiles = {  
[1] = "test1",  
[6] = "test2",  
[4] = "test3" 
}  
 
for k, v in ipairs(tabFiles) do 
    print(k, v)  
end

现在的输出结果显而易见就是key=1时的value值test1

代码如下:

>lua -e "io.stdout:setvbuf 'no'" "test.lua"   
1 test1  
>Exit code: 0

代码如下:

-- [[示例1.]] --  
local tt =  
{  
    [1] = "test3",  
    [4] = "test4",  
    [5] = "test5" 
}  
 
for i,v in pairs(tt) do     -- 输出 "test4" "test3" "test5" 
    print( tt[i] )  
end  
 
for i,v in ipairs(tt) do    -- 输出 "test3" k=2时断开  
    print( tt[i] )  
end  
 
-- [[示例2.]] --  
tbl = {"alpha", "beta", [3] = "uno", ["two"] = "dos"}  
 
for i,v in ipairs(tbl) do    --输出前三个  
    print( tbl[i] )  
end  
 
for i,v in pairs(tbl) do    --全部输出  
    print( tbl[i] )  
end

(0)

相关推荐

  • Lua中pairs与ipairs的区别总结

    前言 最近在用 nginx_lua_module模块写一个流量转发的东西,根据 Header, Body, Cookie 按照流量比例转发到另一个地方.看了前人写的代码,里面循环的时候有的用 pairs ,有的用 ipairs ,很不解.好在 Lua 官网就有电子版的< Programming in Lua>,学习非常方便.以下内容是我初学 Lua 的笔记和思考,如果不正确,欢迎指正. 标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组

  • Lua 中 pairs 和 ipairs 的区别

    官方文档上的说明: 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 pairs (1,t[1]), (2,t[2]), ···, up to the first integer key absent from the table. pai

  • Lua中ipair和pair的区别

    先看看官方手册的说明吧: 复制代码 代码如下: 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

  • 实例讲解Lua中pair和ipair的区别

    采用pair: 复制代码 代码如下: function print_contents(params)      for k, v in pairs(params) do          print(k, "  ", v)      end  end    print_contents({20, 40, 50}) 采用inpari: 复制代码 代码如下: local tt =    {        [1] = "test3",        [4] = "

  • Lua中关于求模与求余的区别介绍

    我觉得很多人搞不清楚这两个概念的区别,刚好在翻译lua手册时遇到%与math.fmod这两个操作,顺便做一下说明吧. 求模与求余的区别. 假设对a与b两个整数做求模或求余操作.那么第一步是先求整数商c,即a / b的值,第二步是计算模或余数:a - c * b.求模与求余的区别在于怎么处理a / b的值. 求模运算时,a / b的结果向无穷小方向舍入,求余运算时a / b的结果向0方向舍入. 因此,求模时结果的符号与b一致,求余时结果的符号与a一致. 在Lua中4%(-3)等于-2,由此可以看出

  • Lua中的迭代器和泛型for学习总结

    前言 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的"下一个"元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道它所在的位置及如何走到下一个位置,通过之前博文的总结,闭包对于这样的任务提供了极佳的支持.现在我们就用代码来实现一个简单的迭代器. 复制代码 代码如下: function values(tb)      local i = 0      return function ()          

  • Lua中的基本语法、控制语句总结

    前言 学习一门语言,首先就是从最基本的语法开始,这一篇将对Lua中的语句进行概要的总结. 赋值 赋值的基本含义是修改一个变量或一个table中字段的值,这个和其它语言没有多少区别,但是对于Lua,有一个特性,它允许"多重赋值",也就是一下子将多个值赋予多个变量,例如以下代码: 复制代码 代码如下: local x1, x2 = 2, 4 print(x1)     -->2 print(x2)     -->4 在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值

  • Lua中基本的数据类型、表达式与流程控制语句讲解

    1. Lua类型 1.1 基本类型 Lua是一种动态类型语言,没有类型定义的语法.Lua一共有8种基础类型:nil(空).boolean(布尔).number(数字).string(字符串).userdata(自定义类型).function(函数).thread(线程).table(表). 函数type可根据一个值返回其类型名称(字符串),如print(type(print)),输出"function":print(type(type(X))) ,输出"string"

  • Lua中的变量类型与语句学习总结

    1. Lua类型 1.1 基本类型 Lua是一种动态类型语言,没有类型定义的语法.Lua一共有8种基础类型:nil(空).boolean(布尔).number(数字).string(字符串).userdata(自定义类型).function(函数).thread(线程).table(表). 函数type可根据一个值返回其类型名称(字符串),如print(type(print)),输出"function":print(type(type(X))) ,输出"string"

  • Lua中的捕获机制和转换技巧介绍

    捕获 捕获是这样一种机制:可以使用模式串的一部分匹配目标串的一部分.将你想捕获的模式用圆括号括起来,就指定了一个捕获. 在string.find使用捕获的时候,函数会返回捕获的值作为额外的结果.这常被用来将一个目标串拆分成多个: 复制代码 代码如下: pair = "name = Anna" _, _, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)") print(key, value)    --> na

随机推荐