在 Lua 元表中同时指定"methods"和索引运算符



我需要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查找或函数调用。

最新更新