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 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 (t)If t has a metamethod __ipairs, calls it with t as argument and returns the first three results from the call.
Otherwise, 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会遍历table的所有键值对。如果你看过耗子叔的Lua简明教程,你知道table就是键值对的数据结构。

而ipairs就是固定地从key值1开始,下次key累加1进行遍历,如果key对应的value不存在,就停止遍历。顺便说下,记忆也很简单,带i的就是根据integer key值从1开始遍历的。

请看个例子。

代码如下:

tb = {"oh", [3] = "god", "my", [5] = "hello", [6] = "world"}

for k,v in ipairs(tb) do
     print(k, v)
end

输出结果就是:

代码如下:

1       oh
2       my
3       god

因为tb不存在tb[4],所以遍历到此为止了。

代码如下:

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

输出结果:

代码如下:

1       oh
2       my
3       god
6       world
5       hello

我们都能猜到,将输出所有的内容。然而你发现输出的顺序跟你tb中的顺序不同。
如果我们要按顺序输出怎么办?办法之一是:

代码如下:

for i = 1, #tb do
     if tb[i] then
          print(tb[i])
     else
end

当然,仅仅是个数组的话,ipairs也没问题。

以上(为什么不少回答会以「以上」收尾?,这里就是结束的意思吧)

(0)

相关推荐

  • 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中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中关于求模与求余的区别介绍

    我觉得很多人搞不清楚这两个概念的区别,刚好在翻译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中的解析表达式

     使用一个模式 这个例子显示了一个建立和使用模式的程序,它非常简单但很完整: 复制代码 代码如下: local lpeg = require "lpeg" -- matches a word followed by end-of-string p = lpeg.R"az"^1 * -1 print(p:match("hello"))        --> 6 print(lpeg.match(p, "hello")) 

  • Lua中的模块(module)和包(package)详解

    前言 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个程序库,可以通过require来加载.然后便得到了一个全局变量,表示一个table.这个table就像是一个命名空间,其内容就是模块中导出的所有东西,比如函数和常量,一个符合规范的模块还应使require返回这个table.现在就来具体的总结一下require和module这两个函数. require函

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

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

  • LUA中的闭包(closure)浅析

    之前对closure一知半解,在网上也找不到一篇文章能把它说清楚,今天好像第一次对它有点清晰的了解 了,写个BLOG记念一下 lua的函数是一种 First-Class Value 的东西, 到底是啥? 就是它们与传统类型的变值没啥区别, 可以 存到一个变量中, 可以 存到table中, 可以 作为实参传递给其它函数, 可以 作为其它函数的返回值. 它们还具有特定的词法域(Lexical Scoping), 也就是说, 一个函数可以嵌套在另一个函数中, 内部的函数可以访问外部函数中的变量. 如下

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

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

  • Lua中的函数精讲笔记

    函数的用途: 1.完成指定的任务,这种情况下作为调用语句使用. 2.计算并返回值,这种情况下,函数作为赋值语句的表达式使用. 函数的参数为空,必须使用()表示函数调用.例外:当函数只有一个参数,并且这个参数是字符串或表构造时,()是可选的. lua提供了面向对象调用函数的语法 o:foo(x)与o.f(o,x)是等价的. lua函数的实参与形参的匹配与赋值语句类似,多余部分被忽略,缺少部分nil补足. lua函数可以返回多个值,return后列出要返回值的列表即可返回多值 复制代码 代码如下:

随机推荐