Lua中的table构造式,table constructor

最简单的构造式就是一个空构造式{},用于创建一个空table。

构造式还可以用于初始化数组。例如,以下语句:

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

"Thursday", "Friday", "Saturday"}

会将days[1]初始化为字符串“Sunday”、days[2]初始化为"Monday",以此类推。

Lua还提供了一种特殊的语法用于初始化记录风格的table:

a = {x=10, y=20}

以上这行代码等价于这些语句:

a = {}; a.x=10; a.y=20

无论使用哪种方式来创建table,都可以在table创建之后添加或删除其中的某些字段。

【使用table编写链表】

我们可以使用这样的方式使用table编写一个链表代码:每当Lua评估一个构造式时,都会先创建一个新table,然后初始化它。如下:

list = nil

for line in io.lines() do

list = {next=list, value=line}

end

这段代码从标准输入中读取每行的内容,然后将每行按相反的次序存储到一个链表中。链表的每个节点都是一个table,table中含有两个字段:value(每行的内容)和next(指向下一个结点的引用)。以下代码便利了改练表,并打印了其内容:

local l = list

while l do

print(l.value)

l = l.next

end

可以将记录风格的初始化与列表风格的初始化混合在一个构造式中使用:

polyline = {color="blue",thickness=2,npoints=4,

{x=0, y=0},

{x=-10, y=0},

{x=-10, y=1},

{x=0, y=1}

}

print(polyline[2].x) --> -10

print(polyline[4].y) --> 1

这两种风格(列表风格和记录风格)的构造式各有其限制。例如,不能使用负数的索引,也不能用运算符作为记录的字段名。为了满足这些要求,Lua还提供了一种更通用的格式。这种格式允许在方括号之间,显式地用一个表达式来初始化索引值:

opnames = {["+"] = "add", ["-"] = "sub",

["*"] = "mul", ["/"] = "div"}

i = 20; s = "-"

a = {[i+0] = s, [i+1] = s .. s, [i+2] = s .. s .. s}

print(opnames[s]) --> sub

print(a[22]) --> ---

这种语法看似烦琐了一点,但却非常灵活。无论是列表风格的初始化,还是记录风格的初始化,其实都是这种通用语法特例。构造式{x=0,y=0}等价于{["x"]=0,["y"]=0},构造式{"r","g","b"}等价于{[1]="r",[2]="g",[3]="b"}。

对于某些特殊情况如果真的需要以0作为一个数组的起始索引的话,通过这种语法也可以轻松做到:

days = {[0]="Sunday","Monday","Tuesday","Wednesday",

"Thursday","Friday","Saturday"}

在一个构造式中还可以用分号(;)替代逗号(,)。