lua中的metatable(元表),主要用來描述table的行爲,好比兩個table如何進行算數運算等等。html
咱們能夠經過getmetatable方法來獲取一個表的元表。ui
t = {}
print(getmetatable(t)) --> nil
複製代碼
從上面能夠看出,lua在建立一個表的時候,默認的元表是nil,就是沒有元表。lua
咱們能夠使用下面的方式來給一個表添加元表:spa
t = {}
mt = {}
setmetatable(t, mt)
print(getmetatable(t) == mt) --> true
複製代碼
##使用元表來定義連個表的相加操做code
t1 = {10, 20}
t2 = {30, 40}
mt = {
__add = function(a, b)
local res = {}
local k = 1
for _,v in ipairs(a) do
res[k] = v;
k = k+1
print(k .. v)
end
for _,v in ipairs(b) do
res[k] = v
k = k+1
print(k .. v)
end
return res
end,
__tostring = function(t)
local res = ""
for k,v in ipairs(t) do
res = res .. k .. ':' .. v .. '\n';
end
return res
end
}
setmetatable(t1, mt)
setmetatable(t2, mt)
t3 = t1 + t2
setmetatable(t3, mt)
print(t3)
-- 1:10
-- 2:20
-- 3:30
-- 4:40
複製代碼
上面這個例子,咱們定義了兩個表和一個元表,而後元表裏面定義了__add方法和__tostring方法。htm
__add方法用來定義當兩個表進行+操做的時候,如何處理。至關於運算符重載。 __tostring方法用來當print輸出表的時候,會調用該表的元表中定義的__tostring方法來輸出對應的內容。ip
能夠看到,例子t1,t2,t3的元表都設置爲了mt。文檔
上面提到了相加操做,那你確定知道還有-,*,/等各類操做了。get
還有很是多,有須要的時候能夠本身實現這些方法。string
所有的方法請參考官方文檔: www.lua.org/manual/5.3/…