lua __index metamethod用不同的表调用

时间:2014-08-06 17:33:14

标签: lua

我正在尝试计算飞行中矩形的顶部,底部,右侧和左侧属性,而不是将它们保留在表格中。

Rect = {}

Rect.__index = Rect

setmetatable(Rect, {
            __index = function(tbl,key)
                if key == 'right' then
                  return tbl.x + tbl.width
                elseif key == 'top' then
                  return tbl.y
                elseif key == 'left' then
                  return tbl.x
                elseif key == 'bottom' then
                  return tbl.y + tbl.height
                end

                return rawget(tbl,key)
               end
})

function Rect.new(x, y, width, height)
    return setmetatable( { x = x, y = y, width = width, height = height }, Rect )
end

function Rect:intersectsWith(other)
    return not (other.left > self.right or other.right < self.left or other.top > self.bottom or other.bottom < self.top)
end

令我困惑的是:

如果

Rect.__index = Rect

服务所以实例可以回退到所有缺少方法的Rect,我的自定义__index实现在哪里?我试图把它放在Rect metatable中,因为_index方法可以被链接。

结果是__index被调用但是表格错误。它崩溃是因为tbl.x和lua不能用它来执行算术。我的猜测是传递的表是Rect表本身,因为调用是链接的。

1 个答案:

答案 0 :(得分:4)

Lua在调用其__index元方法之前检查密钥是否在索引表中,因此return rawget(tbl,key)是多余的。

您真正想要的是return Rect[key],它会在Rect表中查找__index=tbl快捷方式中的值。