Lua中table的几种构造方式详解

之前对于Lua的研究都是纸上谈兵,没有真正的项目练手,现在公司的项目基本上都是用Lua开发,是时候补充一下我那蹩脚的Lua知识了。

基础数据类型、表达式、循环结构什么的我就不说了,这么简单的东西说了也要被大家喷。

今天我想说说table的几种构造方式。

0.Lua调试工具——LuaEditor

首先,如果你是第一次接触Lua,请补充一下Lua的最基本之中的基础语法(小若:O O!),然后下载一个LuaEditor工具,用来查看Lua执行效果,当然也可以调试,本篇内容不解释这个工具。可以百度一下这个工具。

1.什么是table?

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

2.如何创建一个table?

创建table是一件很复杂的事情,不知道大家顶不顶得住,试试看,如下:

代码如下:

local a = {}

这样就创建了一个table了。
(小若:噗,真够复杂的…啊,你妹啊,复杂你个头!)

3.如何初始化一个table

嗷,虽然创建table已经很复杂了,更复杂的还在后面,怎么初始化table?看看下面的代码:

代码如下:

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

在LuaEditor中创建一个lua文件,输入以上代码,保存,然后按F5运行,我们将看到输出窗口输出了一个数字:12。

这挺神奇的,感觉就像是在定义数组,不是吗?

table间的元素用逗号分隔,["x"] = 12代表构造一个table元素,下标为”x”,值为12。(小若:为毛数组下标可以是字符串?)

嗷~!我就等旁白问这个问题,旁白你笨蛋啊,我只是说table像数组,我没有说它就是数组,table支持几乎是所有类型的下标,包括函数。

(小若:。。。以后我不会中计了,喵…)

4.有更简洁的方式

这种初始化方式看起来太复杂了,有没有简单点的?看看下面的代码:

代码如下:

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

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

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

代码如下:

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

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

记住,是字符串下标才这么做。

记住,是字符串下标才这么做。(小若:你再说一句试试,我保证以后不帮你吐槽。)

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

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

代码如下:

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

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

代码如下:

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

看看a[1]输出的值是不是12?(小若:但是12的下标应该是0啊,数组下标是从0开始计算的)

再一次警告旁白,table类似数组,但它绝对不是数组。

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

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

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

代码如下:

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

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

因此,a的第一个元素就是{x = 1, y = 2},调用a的第一个元素的方式为:a[1]
由于a[1]又是一个table,所以,再次调用table的x下标的值:a[1].x
这样就OK了。

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

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

代码如下:

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

定义了一个函数test,然后用test作为下标定义了table的一个元素,值为1。
这很奇怪不是吗?但是有时候这样确实很有用,这里暂时不解释。
OK,关于table的构造方式,暂时说这么多,有点累了,晚安。

(0)

相关推荐

  • Lua中获取table长度问题探讨

    又有同事在lua的table长度问题上犯错了,我们一起来看看吧~~~ 看以下代码: 复制代码 代码如下: local tblTest1 =  {      1,      2,      3  }    print(table.getn(tblTest1)) 这段代码输出的结果是3,这个大家都知道,是吧.不管最后那个3后面有没有加逗号,结果都是3. 再看下面的代码: 复制代码 代码如下: local tblTest2 =  {      1,      a = 2,      3,  }   

  • Lua中使用table实现的其它5种数据结构

    lua中的table不是一种简单的数据结构,它可以作为其他数据结构的基础,如:数组,记录,链表,队列等都可以用它来表示. 1.数组 在lua中,table的索引可以有很多种表示方式.如果用整数来表示table的索引,即可用table来实现数组,在lua中索引通常都会从1开始. 复制代码 代码如下: --二维数组 n=10 m=10 arr={} for i=1,n do      arr[i]={}    for j=1,m do       arr[i][j]=i*j    end end f

  • Lua中对table排序实例

    lua中利用到的排序的基本上就是构造函数(table)了,为了便于和C区分开来,我俗称它为表单. 实例:(原理就是LUA集成的冒泡算法) 排序的一般姿势(对于只包含数字或者只包含字符串的简单数组) 复制代码 代码如下: table.sort(test) 扩展版 复制代码 代码如下: table.sort(test, function(a,b) return a.id<b.id end ) 实例一:值排序 1.数组模式 复制代码 代码如下: local test0 ={1,9,2,8,3,7,4,

  • Lua table简明总结

    一. table table是lua唯一的数据结构.table 是 lua 中最重要的数据类型. table 类似于 python 中的字典.table 只能通过构造式来创建.其他语言提供的其他数据结构如array.list等等,lua都是通过table来实现的.table非常实用,可以用在不同的情景下.最常用的方式就是把table当成其他语言的数组. 实例1: 复制代码 代码如下: mytable = {} for index = 1, 100 do     mytable[index] =

  • Lua教程之弱引用table

    这次要介绍的内容比较少,就一个--弱引用table 1.无法超越人类智慧的智能--自动内存管理的缺陷 我们都知道,Lua是具备自动内存管理的,好吧,也许有些朋友不知道. 我们只管创建对象,无须删除对象(当然,对于不要的对象你需要设置一下nil值),Lua会自动删除那些被认为是垃圾的对象. 问题就出现在,什么对象才是垃圾对象,有些时候,我们很清楚某个对象是垃圾,但是,Lua却无法发现.   比如这样一个例子: 复制代码 代码如下: t = {};        -- 使用一个table作为t的ke

  • Lua中遍历数组和table的4种方法

    方法一,可以用for来遍历: 复制代码 代码如下: do      table_week = {      "w",      "e",      "r",      "t",      "y",      "u",      "i",      }        for i = 1, #table_week do          print(table_week[

  • Lua中设置table为只读属性的方法详解

    项目中部分只读表易被人误改写,故决定在非线上环境里对这些表附加只读属性,方便在出现误改写的时候抛出lua错误,最终版代码如下: --[[------------------------------------------------------------------------------ -** 设置table只读 出现改写会抛出lua error -- 用法 local cfg_proxy = read_only(cfg) retur cfg_proxy -- 增加了防重置设置read_o

  • 获取Lua表结构(table)数据实例

    只是获取一个全局变量什么的太没意思了,今天我们来玩个高难度的--获取Lua表结构的数据. (旁白:O O!我是不是该说点什么?) 上一章传送门:http://www.jb51.net/article/55093.htm 1. 什么是table table是Lua里最强大的数据类型,我们可以当成是数组,但是它又和数组有点不一样,建议大家看看Lua的语法教程,因为我对table也没有熟悉到可以给大家解释的程度. (旁白:那你还写什么教程...) 2. 获取table变量 现在,我们给helloLua

  • Lua中的table学习笔记

    table 在 Lua 里是一种重要的数据结构,它可以说是其他数据结构的基础,通常的数组.记录.线性表.队列.集合等数据结构都可以用 table 来表示,甚至连全局变量(_G).模块.元表(metatable)等这些重要的 Lua 元素都是 table 的结构.可以说,table  是一个强大而又神奇的东西. table 特性 在之前介绍 Lua 数据类型时,也说过了 table 的一些特性,简单列举如下(详情可查看之前的介绍): 1.table是一个"关联数组",数组的索引可以是数字

  • Lua中的table浅析

    Lua的table提供了Map的功能,实现了"关联数组",并且整数.字符串甚至nil都可以作为索引/key:table没有固定的大小.   基于table,可以表示普通数组.符号表.集合.记录.队列和其他数据结构.   而Lua也是通过table来解决模块(module).包(package)和对象(Object)的. 例如io.read表示使用"read"来索引table io.   在Lua中,table既不是值也不是"变量",而是对象,可以

随机推荐