Lua學習筆記9】Lua中的metatable和metaemethods介紹

metatable

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

__sub(減)

__mul(乘)

__div(除)

還有很是多,有須要的時候能夠本身實現這些方法。string

所有的方法請參考官方文檔: www.lua.org/manual/5.3/…

相關文章
相關標籤/搜索