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的值?

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

lua table、ipairs/pairs基础知识的更多相关文章

  1. Lua for - ipairs,pairs,# 遍历的运行时间

  2. Lua 学习之基础篇四<Lua table(表)>

    table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...

  3. Step By Step(Lua基础知识)

    Step By Step(Lua基础知识) 一.基础知识:    1. 第一个程序和函数:    在目前这个学习阶段,运行Lua程序最好的方式就是通过Lua自带的解释器程序,如:    /> l ...

  4. lua面试基础知识

    1.lua中八种基础类型:nil(空),boolean(布尔),number(数字),string(字符串),userdata(自定义类型),function(函数),thread(线程),table ...

  5. Lua Table pairs输出顺序问题 (版本差异 解决数字索引间断并兼容字符串索引)

    问题标签: Lua Table 迭代器;Lua Table 输出顺序; Lua Table 顺序输出;Lua Table 数字索引 字符串索引;Lua Table pairs; 问题背景: 使用pai ...

  6. lua table integer index 特性

    table.maxn (table) Returns the largest positive numerical index of the given table, or zero if the t ...

  7. Lua table使用

    days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Th ...

  8. 3-学习GPRS_Air202(需要知道的关于Lua的一些基本的知识)

      http://www.cnblogs.com/yangfengwu/p/8948935.html 学东西一定是打破沙锅学到底,有问题就解决问题,不要试图去回避或者放弃解决当前的问题,如果总是回避或 ...

  9. 大数据基础知识问答----spark篇,大数据生态圈

    Spark相关知识点 1.Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架 dfsSpark基于mapredu ...

随机推荐

  1. jQuary总结6:元素的操作

    1 empty方法 //html <div> <p></p> <span></span> </div> //js $('div) ...

  2. sql语言的一大类 DML 数据的操纵语言

    -DML(insert,update,delete) 1.插入数据insert into 表名(列,列...)values(值,值...)//当插入的数据与表格一一对应时,列可以省略insert in ...

  3. Ubuntu重复循环启动的快速解决方法

    如果因为在配置java或者adb环境变量时修改profile文件导致的在登录界面输入密码后重复循环启动的问题,下面总结网上和实践找到快速解决的方法啦! 1.在登录界面按下ctrl+alt+F1进入命令 ...

  4. JW Player开始播放和结束播放事件的捕获

    项目中使用到jwPlayer,需要在用户开始播放盒结束播放的时候触发一些事件,所以研究JWPlayer. <script type="text/javascript"> ...

  5. 安装Python-Windows

    安装Python-Windows 在开始Python编程前,需要先安装Python环境.Python安装包可以到Python的官网下载,官网地址是https://www.python.org/,如果想 ...

  6. CDC--Demo

    --CDC通过对事务日志的异步读取,记录DML操作的发生时间.--类型和实际影响的数据变化,然后将这些数据记录到启用--CDC时自动创建的表中.通过cdc相关的存储过程,可以获--取详细的数据变化情况 ...

  7. C++11左值引用和右值引用

    转载:https://www.cnblogs.com/golaxy/p/9212897.html C++11的左值引用与右值引用总结 概念 1.&与&&  对于在C++中,大家 ...

  8. MySQL数据库(四)

    操作数据库表的内容: -- 向表中插入数据:insert into table_name values(now(),'a'); insert into student (id,name,sex) va ...

  9. .net Timer定时执行

    System.Timers.Timer可以实现数据库定时更新的功能 Global.asax void Application_Start(object sender, EventArgs e) { / ...

  10. Redis!

    在安装redis完成时,使用windows管理redis工具时(例如RedisDesktopManager)时出现连接不上的问题时 ping一下你的ip 和 talnet ip  看看通不通. 如果不 ...