lua table、ipairs/pairs基础知识

1.什么是table?

table是Lua最复杂最强大的数据结构,Lua本身并不是面向对象语言,但是对面向对象中毒比较深的程序员,可以借助table”完美”地模拟面向对象编程。最简单地,我们可以把table理解为数组,最复杂的,我们可以把table理解为”世间万物”,因为它可以创造出很多你想象不到的东西。一个字,自由度非常大~!

2.如何创建一个table?

local a = {}

或者

local a = {["x"] = 12, ["mutou"] = 99, [3] = "hello"}

table里的元素用逗号分隔,["x"] = 12代表构造一个table元素,下标为”x”,值为12。

table支持几乎是所有类型的下标,包括函数。

3.有更简洁的方式

上面下标看起来太复杂了,有没有简单点的?看看下面的代码:

local a = {x = 12, mutou = 99, [3] = "hello"}
print(a["x"]);

运行结果仍然是输出12,也就是说,表创建或初始化时,对于字符串下标,我们可以省略方框和双引号,但是数字下标不可以,千万不要搞混了。

但是,a["x"]这种调用方式也很烦人不是吗?程序员都很懒的,所以Lua支持一下这种方式的调用:

print(a.x);

输出结果仍然是12,也就是说,对于字符串下标,可以直接用a.x的形式调用,也是省略了方框和双引号,调用方式和初始化一样,这样就不会搞混了,记住,是字符串下标才这么做。

4.想要默认数字索引怎么办?

如果说,大家习惯了数组,用数字下标,又不想自己一个个数字地定义,比如:

local a = {[1] = 12, [2] = 43, [3] = 45, [4] = 90}

没关系,Lua又为爱偷懒的程序员提供了一招,如下:

local a = {12, 43, 45, 90}
print(a[1]);

输出12。

table默认的第一个索引下标是1,并且很多相关的函数也假设table的第一个索引下标为1,所以大家最好遵守这个规则。

5.更强大的应用之table的table

table什么都能放,当然也能放table了,如下:

local a = {
 {x = 1, y = 2},
 {x = 3, y = 10}
}

我们定义了一个table,命名为a,table有两个元素,分别是两个没有名字的table,没有显示指定下标,那Lua就会默认给table的元素赋予下标(从1开始)

因此,a的第一个元素就是{x = 1, y = 2},调用a的第一个元素的方式为:a[1]

由于a[1]又是一个table,所以,再次调用table的x下标的值:a[1].x
这样就OK了。

6.更强大的应用之函数下标

我们最后来试试更好玩的,用一个函数当table的下标:

function test()
 print("Hello Table");
end
local a = {[test] = 1}
print(a[test]);

定义了一个函数test,然后用test作为下标定义了table的一个元素,值为1。

7.pairs()和ipairs()常用来遍历表,有什么区别呢?

pairs能够遍历表中全部的元素,但顺序是乱序的。

ipairs会依次遍历索引为1的值,索引为2的值,索引为3的值。。。直到值为nil,退出遍历

举例:

local a = {[1] = "a1", [2] = "a2", [4] = "a3", [5] = "a4", [6] = "a5"}

for key, value in ipairs(a) do

  ngx.say("key=", key, ", value=", value)

end

结果是

key=1, value=a1

key=2, value=a2

因为在table a中,索引为3对应的的值为nil,故就退出遍历了,只能遍历到索引为1、2的值。

8.#table的值?

无意义。想获取表元素个数的话,只能自己写函数。

转载于:https://www.cnblogs.com/koushr/p/5873379.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值