在Lua metatable中指定“方法”和索引运算符

时间:2014-05-03 20:28:58

标签: lua metatable lua-userdata

我需要userdata对象来支持方法和索引操作符(带整数索引)。有没有办法在没有通过函数模拟方法的情况下在公共元表中实现这一点?

我尝试通过将metatable(object).__index设置为包含实际方法的表,并将metatable(metatable(object).__index).__index设置为实现索引运算符的函数来链接元表。但是,使用第一个__index表作为参数调用该函数,而不是原始对象。这似乎是一种设计疏忽,因为当__index元方法是一个函数时传递原始对象更有意义。无论如何,有没有办法实现我想要的,而无需在__index函数中明确检查方法名称?

2 个答案:

答案 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查找或函数调用。