Lua学习

作者: 指间罅隙 | 来源:发表于2018-06-08 17:26 被阅读0次

    Lua 学习

    元表

    • setmetatable(table,metatable): 对指定table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable会失败 。 返回 table
    • getmetatable(table): 返回对象的元表(metatable)。

    __index 元方法 :访问值

    Lua查找一个表元素时的规则,其实就是如下3个步骤:

    • 1.在表中查找,如果找到,返回该元素,找不到则继续
    • 2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
    • 3.判断元表有没有index方法,如果index方法为nil,则返回nil;如果index方法是一个表,则重复1、2、3;如果index方法是一个函数,则返回该函数的返回值。

    __newindex 元方法:赋予值

    • 1.索引键有值,直接赋值,该索引键没值则继续
    • 2.table不是表,或者表不存在该键值,调用table的元方法。没有元方法直接赋值。
    • 3.元方法是表,重复1,2。如果元方法是函数,则调用f(table,key,v)

    __call 元方法:调用一个值时调用 xx()

       local a = { qqq = '嗯哼' }
        local mt = {}
        mt.__add = function(a, b)
            return a .. b
        end
        --t.key不存在的时候 调用
        mt.__index = function(t, key)
            if key == 'sss' then
                return "哈哈哈"
            else
                return "啪啪啪"
            end
        end
        --t.key = v 时调用
        mt.__newindex = function(t, key, v)
            --赋值方法 rawset
            rawset(t, key, v)
        end
        mt.__call = function(t,v)   
            return t.qqq .. "字符串拼接"..v
        end
        local c = setmetatable(a, mt)
        cclog("-----------a--" .. a.sss) --输出: -----------a--哈哈哈
        cclog("-----------a--" .. a.www) --输出: -----------a--啪啪啪
        cclog("-----------a--" .. a.qqq) --输出: -----------a--嗯哼
        a.sss = "我我我"
        a.www = "你你你"
        cclog("-----------c--" .. c.sss) --输出: -----------c--我我我
        cclog("-----------c--" .. c.www) --输出: -----------c--你你你
        cclog("-----------c--" ..c("星期天"))--输出: -----------c--嗯哼字符串拼接星期天
    

    其他元函数

    __add 对应的运算符 '+'.
    __sub 对应的运算符 '-'.
    __mul 对应的运算符 '*'.
    __div 对应的运算符 '/'.
    __mod 对应的运算符 '%'.
    __unm 对应的运算符 '-'.
    __concat 对应的运算符 '..'.
    __eq 对应的运算符 '=='.
    __lt 对应的运算符 '<'.
    __le 对应的运算符 '<='.

    相关文章

      网友评论

          本文标题:Lua学习

          本文链接:https://www.haomeiwen.com/subject/bfwasftx.html