调用表中函数tbl.myIndex(myParameters)时,哪个Lua元方法会触发?
问题解答
当你直接调用myTbl.myIndex()时,不会触发任何元方法。原因很明确:myIndex是直接存储在myTbl表中的键,Lua访问这个键时能直接在表本身找到对应的函数值,完全不需要依赖元表的任何元方法。
只有当操作触发了表的“边界场景”时,元方法才会生效,常见触发逻辑包括:
__index:访问表中不存在的键__newindex:给表中不存在的键赋值__call:把表当作函数调用(比如myTbl())__add/__sub等算术元方法:对表执行算术运算- 其他元方法也各自对应特定的触发场景
如果想让myTbl.myIndex的调用触发元方法,你需要把myIndex从原表中移除,让Lua无法直接找到这个键,这时就会触发__index元方法,示例代码如下:
local myTbl = setmetatable({}, { __index = function(tbl, key) if key == "myIndex" then return function(myParam) print(myParam) end end end }) myTbl.myIndex("test") -- 此时会触发__index元方法
内容的提问来源于stack exchange,提问作者Hristiyan
相关产品推荐
相关产品推荐

