學習筆記 --lua 元表 metatable
元表的基本概念: metatable 元表是table 預定義的一些列操作。 例如 將兩個table相加,Lua會先去檢查這兩個table是否有metatable。然後再檢查metatable中是否有__add方法。如果有則按__add中的方法來執行,沒有則報錯。
-- Lua中的每一個值都有或者可以有一個元表。在我的理解中,元表可以是函式,也可以是自定義的屬性。
-- 注意: Lua在新建的table的時候是不會建立元表的,需要使用setmetatable方法設定元表。
setmetatable(a,b) ------a是需要設定元表的物件, b是元表的值(可以是任何值)
getmetatable(a) ----- 可以查詢a是否有元表。
例子:
Bag = {}
function Bag.new(x)
local bag = {}
for i,v in ipairs(x) do
bag[v] = v
end
----這裡開始為Bag的實力物件設定元表。設定的元表是一個方法, 名字為__add---------方法的行為是addmeta函式內的操作。
Bag.mymetatable = {}
Bag.mymetatable.__add = Bag.addmeta
setmetatable(bag,Bag.mymetatable)
return bag
end
function Bag.addmeta(a,b)
local outTable = Bag.new({})
for i,v in pairs(a) do
outTable[v] = v
end
for i,v in pairs(b) do
outTable[v]= v
end
return outTable
end
local a = Bag.new({1,2,3,4}) --{1,2,3,4}
local b = Bag.new({5,6,7,8})--{5=5,6=6,7=7,8=8}
local mt = getmetatable(a) --__add:function: 0x14014e40
local mt = getmetatable(b) --__add:function: 0x14014e40
local c = a+b
printt(c)