0%

Lua 元表 metatable 与 类定义

元表(metatable) 是 Lua 中的重要概念,每一个 table 都可以加上 metatable,以改变相应的 table 的行为。

Lua 中不能改变其他类型的元表(除了使用调试库),必须使用 C API 才能做到。

元表也是普通的 table,定义了原始值在某些特定操作下的行为。你可通过在值的原表中设置特定的字段来改变作用于该值的操作的某些行为特征。

1
2
3
4
t = {} -- 普通的table
mt = {} -- metatable
setmetatable(t, mt) -- 设定mt为t的metatable
getmetatable(t) -- 返回mt

metatable 可以包括任何东西,metatable 特有的键一般以__开头,例如 __index 和 __newindex,它们的值一般是函数或其他 table。

我们称元表中的键为事件(event),称值为元方法(metamethod)

元方法

__index

当你通过键来访问 table 的时候,如果这个键没有值,那么 Lua 就会寻找该 table 的 metatable(假定有metatable)中的 __index 键。如果 __index 包含一个表格,Lua 会在表格中查找相应的键。

1
2
3
4
mttable = { foo = 3 }
t = setmetatable({}, { __index = mttable })
t.foo -- 3
t.bar -- nil

__call

__call 使得你可以像调用函数一样调用table