Lua语言中的table

Table

1 关系表类型,这是一个很强大的类型。我们可以把这个类型看作是一个数组。只是C语言的数组,只能用正整数来作索引;在Lua中,你可以用任意类型来作数组的索引,除了nil。同样,在C语言中,数组的内容只允许一种类型;在Lua中,你也可以用任意类型的值来作数组的内容,除了nil。

Table的定义很简单,它的主要特征是用"{"和"}"来括起一系列数据元素的。比如:

 

T1 = {}  -- 定义一个空表

T1[1]=10  -- 然后我们就可以象C语言一样来使用它了。

T1["John"]={Age=27, Gender="Male"}

这一句相当于:

T1["John"]={}  -- 必须先定义成一个表,还记得未定义的变量是nil类型吗

T1["John"]["Age"]=27

T1["John"]["Gender"]="Male"

当表的索引是字符串的时候,我们可以简写成:

T1.John={}

T1.John.Age=27

T1.John.Gender="Male"

T1.John{Age=27, Gender="Male"}

这是一个很强的特性。

 

在定义表的时候,我们可以把所有的数据内容一起写在"{"和"}"之间,这样子是非常方便,而且很好看。比如,前面的T1的定义,我们可以这么写:

 

T1=

{

10,  -- 相当于 [1] = 10

[100] = 40,

John=  -- 如果你原意,你还可以写成:["John"] =

{

Age=27,   -- 如果你原意,你还可以写成:["Age"] =27

Gender=Male   -- 如果你原意,你还可以写成:["Gender"] =Male

},

20  -- 相当于 [2] = 20

}

 

看起来很漂亮,不是吗?我们在写的时候,需要注意三点:

第一,所有元素之间,总是用逗号","隔开;

第二,所有索引值都需要用"["和"]"括起来;如果是字符串,还可以去掉引号和中括号;

第三,如果不写索引,则索引就会被认为是数字,并按顺序自动从1往后编;

表类型的构造是如此的方便,以致于常常被人用来代替配置文件。是的,不用怀疑,它比ini文件要漂亮,并且强大的多。

 

2.table的下标

-- Arrays

myData = {}

myData[0] = “foo”

myData[1] = 42

 

-- Hash tables

myData[“bar”] = “baz”

 

-- Iterate through the

-- structure

for key, value in myData do

print(key .. “=“ .. value)

end

 

输出结果

0=foo

1=42

bar=baz

 

程序说明

首先定义了一个table myData={}, 然后用数字作为下标赋了两个值给它. 这种

定义方法类似于C中的数组, 但与数组不同的是, 每个数组元素不需要为相同类型,

就像本例中一个为整型, 一个为字符串.

 

程序第二部分, 以字符串做为下标, 又向table内增加了一个元素. 这种table非常

像STL里面的map. table下标可以为Lua所支持的任意基本类型, 除了nil值以外.

 

Lua对Table占用内存的处理是自动的, 如下面这段代码

a = {}

a["x"] = 10

b = a   -- `b' refers to the same table as `a'

print(b["x"]) --> 10

b["x"] = 20

print(a["x"]) --> 20

a = nil  -- now only `b' still refers to the table

b = nil  -- now there are no references left to the table

b和a都指向相同的table, 只占用一块内存, 当执行到a = nil时, b仍然指向table,

而当执行到b=nil时, 因为没有指向table的变量了, 所以Lua会自动释放table所占内存

 

3.Table的嵌套

Table的使用还可以嵌套,如下例

-- Table ‘constructor’

myPolygon = {

color=“blue”,

thickness=2,

npoints=4;

{x=0, y=0},

{x=-10, y=0},

{x=-5, y=4},

{x=0,  y=4}

}

 

-- Print the color

print(myPolygon[“color”])

 

-- Print it again using dot

-- notation

print(myPolygon.color)

 

-- The points are accessible

-- in myPolygon[1] to myPolygon[4]

 

-- Print the second point’s x

-- coordinate

print(myPolygon[2].x)

 

程序说明

首先建立一个table, 与上一例不同的是,在table的constructor里面有{x=0,y=0},

这是什么意思呢? 这其实就是一个小table, 定义在了大table之内, 小table的

table名省略了.

最后一行myPolygon[2].x,就是大table里面小table的访问方式.

4  key

  1. mytable = { 10, ddd = 301213 }
  2. print(mytable[1])   
  3. print(mytable[2])   
  4. print(mytable[3])  

注释:

1)、 table 中可以出现没有 key 的项,这个时候,lua 会把这个 table 当做一个数组来看待,这个项的key就是它在数组中的下标(从1开始)

2)、上例中, mytable[1] 是 10, mytable[2] 是 12, ddd = 30 这项会被跳过。mytable[3] 是 13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值