我需要userdata对象来支持方法和索引操作符(带整数索引)。有没有办法在没有通过函数模拟方法的情况下在公共元表中实现这一点?
我尝试通过将metatable(object).__index
设置为包含实际方法的表,并将metatable(metatable(object).__index).__index
设置为实现索引运算符的函数来链接元表。但是,使用第一个__index
表作为参数调用该函数,而不是原始对象。这似乎是一种设计疏忽,因为当__index
元方法是一个函数时传递原始对象更有意义。无论如何,有没有办法实现我想要的,而无需在__index
函数中明确检查方法名称?
答案 0 :(得分:2)
您可以使用单个__index函数,它们都引用方法表并处理整数键。
function metatable:__index(key)
if type(key) == 'string' then
return methodTable[key]
elseif type(key) == 'number' then
return key * 42 + #self
end
end
答案 1 :(得分:1)
当您将__index
设置为表时,Lua会自动对__index
表中的密钥执行常规表查找。它完全等同于debug.getmetatable(obj).__index[k]
,如果__index
表有自己的__index
表,它将执行递归__index
查找或函数调用。