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 对应的运算符 '<='.
网友评论