表( table )是lua 裡唯一的資料結構, 可以近似地理解為其他程式語言裡的字典、關聯陣列或者key - value 對映,但lua的表更加靈活,能夠模擬出array 、list 、dict 、set, map 等常見資料結構,或者其他任意複雜的結構。
◆ 定義表
lua 裡定義表使用花括號「{}」。
local a = --宣告乙個陣列形式的表
local a = --宣告乙個字典形式的表
注意在使用「 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)
endx.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' --函式內部可以直接修改表的元素
endf(x) --行函式, 表被修改
print(x.name)
Lua 基礎之元表
print getmetatable hello 003e7050 print getmetatable lua 003e7050 print getmetatable 12 nil print getmetatable nil t print getmetatable t nil setmetat...
Lua學習之元表
在 lua table 中我們可以訪問對應的key來得到value值,但是卻無法對兩個 table 進行操作。因此 lua 提供了元表 metatable 允許我們改變table的行為,lua中的每個值都可以用乙個metatable來表示,每個行為則關聯了對應的元方法。元表的處理有兩個很重要的函式 ...
Lua基礎之元表(metatable)
lua中的元表允許我們通過乙個tablea特殊的鍵值自定義另乙個tableb的行為,這些特殊的鍵值稱為元方法,tablea則稱為tableb的元表。函式 描述 index 呼叫乙個索引 newindex 給乙個索引賦值 add 運算子 sub 運算子 mul 運算子 div 運算子 mod 運算子 ...