lua元表

作者: 岛在深海处 | 来源:发表于2018-05-19 13:58 被阅读0次
    1、Lua 元表(Metatable)
    • setmetatable(table,metatable): 对指定table设置元表(metatable),返回普通表(table),如果元表(metatable)中存在__metatable键值,setmetatable会失败 。
    • getmetatable(table): 返回对象的元表(metatable)。
    __index 元方法 (使普通表能够对元表进行访问)

    __index元方法为metatable 最常用的键。当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
    注意再lua中table的键对应的值可以为任何类型包括函数,所以__index也可以是一个函数。

    如下例子可帮助理解__index元方法以及getmetatable()方法的使用。

    table1 = {key1 = "bbg"}
    --这里返回的table即为前面定义的table1
    mytable = setmetatable(table1, {__index={key2="hello"}})
    print(mytable.key2)    --hello
    
    --这里返回的table即为前面设置的{{__index={key2="hello"}}}
    metable = getmetatable(table1)  
    print(metable.__index.key2)     --hello
    
    __newindex 元方法(使普通表能对元表进行更新,普通表本身不会被更新)

    元表设置了元方法 __newindex,在对新索引键(newkey)赋值时(mytable.key2 = "新值2"),会调用元方法__newindex,而不进行赋值。而如果对已存在的索引键(key1),则会进行赋值,而不调用元方法 __newindex。

    table1 = {key1 = "kkk"}
    metatable = {}
    mytable = setmetatable(table1, {__newindex = metatable})
    mytable.key2 = "新值2"
    print(mytable.key2)   --nil
    print(metatable.key2)   --新值2
    
    mytable.key1 = "bbb"
    print(mytable.key1)    --bbb
    print(metatable.key1)   --nil
    
    为表添加操作符 (类似于Java中对方法的重写)
    table1 = {1, 2, 3}
    mytable = setmetatable(table1, {
        __add = function(table1, newtable)
            for k, v in ipairs(newtable) do
                table.insert(mytable, v)
            end
            return mytable
        end
        })
    
    secondtable = {4,5,6}
    sumtable = mytable + secondtable
    print("sumtalbe.len = ", #sumtable)  --6
    for k, v in ipairs(sumtable) do
        print(v)
    end
    

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

    __call 元方法
    __tostring 元方法

    相关文章

      网友评论

          本文标题:lua元表

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