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