1. 程式人生 > >學習筆記 --lua 元表 metatable

學習筆記 --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)