lua 元表 精炼

作用:使两个表关联起来,实现一些自定义化的功能扩展,下面就是些常用扩展

1. __index(实现类似继承的效果)

  访问时,若当前表无此字段,则去元表中找

       local t1 = {}

            t1.a = 123

            local t2 = {}

            setmetatable(t2, {__index = t1})        

            local t3 = setmetatable({}, {__index = t2})  

            print(t3.a)

    输出结果(123)

-元表具有链式关联性,即:关联了多级元表会一直往上查(如上所示)

2. __newindex(自定义控制,添加新元素)

            local t1 = {}

            t1.a = 123

            local t2 = {}

            setmetatable(t2, {__index = t1})

            local t3 = setmetatable({}, {__index = t2, __newindex = 

                function() print("禁止添加新元素") end})

            t3.b = 1

    print(t3.b)

    输出结果(禁止添加新元素, nil)

3. 表与表的运算,下面是加法的实例,其他运算符类似

            local t1 = {}

            t1.a = 123

            local t2 = {a = 456}

            setmetatable(t2, {__add = function(thisTable, otherTable)

                return thisTable.a + otherTable.a

            end})

            print(t1 + t2)

    输出结果(579)

  罗列一下(__add,__sub,__mul,__div,

  __mode,__unm(负数符号,取反),__concat(..字符串拼接)

  __eq(==),__lt(<),__le(<=)

  __tonumber(tonumber)

4. __call(可实现类似C++里的构造函数,当然也可以自定义其他),特点是table自身当做方法调用

            local t1 = {}

            t1.a = 123

            local t2 = {a = 456}

            setmetatable(t2, {__call = function(thisTable)

                return setmetatable({}, {__index = t2})

            end})

            local newT2 = t2()

            print(t2, newT2, newT2.a)

    输出结果(table: 0x120d3c0table: 0x120c940456)

5. __tostring,序列化,用于重写print(table)

            local t1 = {}

            t1.a = 123

            local t2 = {a = 456}

            setmetatable(t2, {__tostring = function(thisTable)

                return "a = "..thisTable.a

            end})

            print(t2)

    输出结果(a = 456)

6. __mode,弱表,定义为弱表的内容,有引用也可被回收,取值哦(k(key弱), v(v弱), kv(一个被回收,两个都从表里删除))

   -- 创建弱表

        local tbl = {}

        setmetatable(tbl, {__mode = "k"})

        local key = {count = 100}

        tbl[key] = 1

        key = {}

        tbl[key] = 2

        -- 强制垃圾收集

        collectgarbage()

        for k,v in pairs(tbl) do

            print(k, v, k.count) 

        end

  输出结果(table: 0xe0e8c02nil)

-当关联了元表,又想对原始表操作,怎么办?

  rawset/get:对表的原始数据操作,忽略元表

参考:https://www.runoob.com/lua/lua-tutorial.html

posted on 2020-08-29 22:07  胖福  阅读(221)  评论(0编辑  收藏  举报

导航