版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sky6even/article/details/90521770
表( table )是Lua 里唯一的数据结构, 可以近似地理解为其他编程语言里的字典、关联数组或者key - value 映射,但Lua的表更加灵活,能够模拟出array 、list 、dict 、set, map 等常见数据结构,或者其他任意复杂的结构。
◆ 定义表
Lua 里定义表使用花括号“{}”。
local a = {3,5,7} --声明一个数组形式的表
local a = {one=1,['two']=2} --声明一个字典形式的表
注意在使用“ key=value ”的形式时key 不需要用单引号或双引号,如果必须要用( 例如key 里有空格或者其他特殊符号) 则要使用“[key]=value ” 的形式。
◆ 操作表
操作表里的元素需要使用方括号“ [] ”:
assert(a[1] == 3 and a[2] == 5) --使用[]访问数组里的元素,整数key
a[1] = 100 --修改第一个元素的值
assert(d['one']) == 1) --使用[]访问字典里的元素,字符串key
d['three']) = 3 --添加一个新元素
如果key 是字符串我们也可以直接使用点号“ . ”来操作, 这时表就可以模拟其他语言里的类或名字空间特性,存储成员变量或成员函数。
x. job = 'hunter' --使用“.”访问表里的元素,字符串key
x.mission = function(dst) --为表添加一个函数变量,相当于成员函数
print('fly to', dst)
end
x.mission('zebes') -- 执行成员函数
运算符“#”可以计算形式表里的数组元素数量,配合for 循环可以实现遍历数组。对于字典形式的表,暂时没有办法能够直接获取元素的数量,使用“#”会返回0。
assert(#a == 3)
for i=1, #a do
print(a[i],’,’ )
end
◆ 范围循环:
范围循环主要用于遍历表里的元素,但需要两个标准库函数的配合: ipairs()和pairs() 。这两个函数起到迭代器的作用,逐个返回表里的key/value。
1、ipairs():
ipairs()只能遍历数组形式的表:
for i,v in ipairs(a) do
print(a[i],',')
end
2、pairs():
pairs()可以遍历任意的表
for k,v in pairs(x) do
print(k,'=>', v)
end
◆ 作为函数参数:
因为表通常都很大,所以当表作为函数的参数时不是传值的方式,而是传引用的方式,也就是说没有拷贝,直接传递表的“引用”,函数体内可以直接修改表的元素。
local function f(v) --定义函数, 表传递的是引用
v . name = v.name . . 'aran' --函数内部可以直接修改表的元素
end
f(x) --行函数, 表被修改
print(x.name)