1

我需要 userdata 对象来支持方法和索引运算符(带有整数索引)。有没有办法在一个常见的元表中实现这一点,而无需通过函数模拟方法?

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

4

2 回答 2

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
于 2014-05-04T07:26:09.283 回答
1

当你设置__index一个表时,Lua 会自动对表中的键进行正常的表查找__index。它完全等同于, 如果表有自己的表debug.getmetatable(obj).__index[k],它将执行递归__index查找或函数调用。__index__index

于 2014-05-03T20:38:22.647 回答