Lua元表、元方法
一个table可以通过key和value去操作,但是两个table之间的操作却操作不了;
所以,Lua的元表就可以操作两个table,改变table的行为;
而关联操作的行为的,就是元方法;
(为指定的table设置元表的方法)
- setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。
- getmetatable(table): 返回对象的元表(metatable)。
例:
1 mytable = {} -- 普通表 2 mymetatable = {} -- 元表 3 setmetatable(mytable,mymetatable) -- 把 mymetatable 设为mytable 的元表
算术操作符:
__add 对应的运算符 '+'.
__sub 对应的运算符 '-'.
__mul 对应的运算符 '*'.
__div 对应的运算符 '/'.
__mod 对应的运算符 '%'.
__unm 对应的运算符 '-'.
__concat 对应的运算符 '..'.
__eq 对应的运算符 '=='.
__lt 对应的运算符 '<'.
__le 对应的运算符 '<='.
元方法:
__index元方法:
通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(元表,假定有元表)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。
__index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil;如果存在则由 __index 返回结果。
__newindex元方法:
__newindex 元方法用来对表更新,__index则用来对表访问。
当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。
__call元方法:
在 Lua 调用一个值时调用。
__tostring元方法:
用于修改表的输出行为。
具体使用方法: