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/…

相关文章
相关标签/搜索