Lua语法深入1

1. table构造器中,可以混用记录式(record-style)的和列表式(list-style)创建属性字段:

polyline = {color="blue",
                thickness=2,
                npoints=4, 
                {x=0,        y=0},            --polyline[1]
                {x=-10,    y=0},           --polyline[2]
                {x=-10,    y=1},           --polyline[3]
                {x=0,    y=1},                --最后的这个“,”有也不报错
                }    

如上的构造器中,有局限,就是不能使用负数index和使用非规范的属性名,如果有这样的需要,要使用方括号“[ ]”:

opnames={["+"]="add",  [“-”]="sub", ["*"]="mul",  [“/”]="div"}

i=20;  s="-"
a = {[i+0]=s, [i+1]=s..s, [i+2]=s..s..s }

使用#获得中间有nil值得table时,获得的结果并不可靠,此时需要将table长度显式地保存起来。

pairs遍历获得的元素顺序每次是随机的,ipairs遍历则是每次按固定顺序的。但实测中:前者遇到nil会跳过往下走,后者遇到第一个nil就结束遍历。

第3种方式就是用"for i=1, #t do"的数值型for循环遍历,这种方式将只输出列表式属性,无法输出记录式属性字段。

a={"Mon","Tus","Wed","Thurs","Fri", details={color="blue"}}

print(#a)
for i=1,#a do
    print(a[i])
end
print(string.rep("*",30))    --******************************
a[2]=nil
a[3]=nil
print(#a)
for k,v in pairs(a) do
    print(k,v)
end
for k,v in ipairs(a) do
    print(k,v)
end
E={}
color = ((a or E).details1 or E).color1    --避免属性不存在时报错的一种写法(如例:不存在details1),好比c#中的安全访问符"?."。这样写可减少对表元素验证是否存在时的每次重读
print(color) print(#a)

2. table.insert()在省略指定位置时,会插元素在table的最后。table.remove()不指定位置时,会删除最后一个元素。指定位置时,table.remove()会删除并返回该元素,并将其后的元素向前移动填充。

借助这2个函数,可以容易实现Stack、Queue和Double Queue(双端队列)。

如Stack的操作可以直接用来对栈顶元素做增加和删除。

Lua5.3新增的table.move(a, f, e, t)可以直接将表a中从索引f到e的元素(包括两端的元素本身)移动到索引t位置上。

table.move(a, 2, #a, 1)
a[#a]=nil      -- 往前复制覆盖时,要注意删除掉尾端相同数量的原位置上的元素擦屁股。 或者用table.remove(a)

table.move(a, 1, #a, 1, {}) --copy 表a的所有元素到新表,返回新表。即制作a的备份 table.move(a, 1, #a, #b+1, b) --copy表a的所有元素到表b末尾

 

posted @ 2025-12-12 22:30  云山漫卷  阅读(4)  评论(0)    收藏  举报