metatable(obj)[event]
metatable(obj)是获取数据obj的元表
metatable(obj)[event]获取元表中某个事件的具体操作,event有__add, __index ...等
__index操作 The indexing access table[key]
function gettable_event (table, key)
local h
if type(table) == "table" then
local v = rawget(table, key)
if v ~= nil then return v end
h = metatable(table).__index
if h == nil then return nil end
else
h = metatable(table).__index
if h == nil then
error(···)
end
end
if type(h) == "function" then
return (h(table, key)) -- call the handler
else return h[key] -- or repeat operation on it
end
end
例子在脚本 一个对象的 userdata 比如是 hFrame 调它的函数 SetSize()
hFrame:SetSize()
hFrame:SetSize 的操作== hFrame.SetSize == hFrame["SetSize"]
这是 会调用 hFrame 这个基本数据类型的 元表__index操作事件
gettable_event(hFrame, "SetSize")
发现type(hFrame)不等于 "table", 获取hFrame这个数据类型自身的元表中的_index操作
h = metatable(table).__index
然后自身元表中的 SetSize函数 h["SetSize"]
前提:
1.在c里面,生成一个新的元表,把 需要给lua调的函数 也就是行为 如 SetSize注册到这个元表中
2.在lua中获取 hFrame 对象时,把这个对象的元表设置成 第1条中生成的元表的行为