lua元表

2018-05-19  本文已影响0人  岛在深海处
1、Lua 元表(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 元方法
上一篇下一篇

猜你喜欢

热点阅读