在Lua元表中同时指定“方法”和索引运算符

我需要userdata对象同时支持方法和索引运算符(使用整数索引)。有没有办法在通用元表中实现此目标,而不是通过函数模拟方法?

我尝试了链接元表,将metatable(object).__index设置为一个具有实际方法的表,将metatable(metatable(object).__index).__index设置为实现索引运算符的函数。然而,该函数被调用时,第一个__index表作为参数传递,而不是原始对象。说实话,这似乎是一种设计上的疏忽,因为当__index元方法是函数时,传递原始对象更有意义。无论如何,是否有一种方法可以在__index函数中不显式检查方法名称的情况下实现我想要的效果?

点赞
用户646619
用户646619

当你将 __index 设为一个表时,Lua 会自动在 __index 表中进行常规的查找操作。这等同于 debug.getmetatable(obj).__index[k],如果 __index 表有自己的 __index 表,它会进行递归的 __index 查找或函数调用。

2014-05-03 20:38:22
用户3574628
用户3574628

你可以使用一个 __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-04 07:26:09