Lua中的每个表可以有它自己的元表,但是Lua中的表默认没有元表:
t = {}
print(getmetatable(t)) --> nil
可以使用setmetatable来设置或修改任何表的元表:
t1 = {}
setmetatable(t, t1)
assert(getmetatable(t) == t1)
任何表都可以作为其他任何表的元表;一组相关的表可以共享一个相同的元表(该元表描述它们相同的行为);一个表也可以作为它自己的元表;
__index元方法:
当访问表中不存在的字段时会到元表中查找 __index字段;如果__index是一个表则返回__index表中对应的字段;如果__index是函数,则以table和key为参数调用该函数,并把函数的返回值作为表相应字段的值。
__newindex元方法:
__newindex和__index的作用基本相同;当给表中不存在的字段赋值时会到元表中查找 __newindex字段;如果__newindex是一个表则对__newindex表中对应的字段赋值;如果__newindex是函数,则以table和key为参数调用该函数;
虽然名字叫元方法,但是__index和__newindex可以是表也可以是函数