使用不同的表调用lua\uuu索引元方法

使用不同的表调用lua\uuu索引元方法,lua,Lua,我试图动态计算矩形的顶部、底部、右侧和左侧属性,而不是将它们保留在表中 Rect = {} Rect.__index = Rect setmetatable(Rect, { __index = function(tbl,key) if key == 'right' then return tbl.x + tbl.width elseif key == 'top' the

我试图动态计算矩形的顶部、底部、右侧和左侧属性,而不是将它们保留在表中

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,我的自定义索引实现会去哪里?我试着把它放在Rect元表中,因为可以链接索引方法


结果是调用了_索引,但使用了错误的表。它崩溃是因为tbl.x和lua不能用它执行算术运算。我的猜测是,传递的表是Rect表本身,因为调用是链接的。

Lua在调用索引表的_index metamethod之前检查索引表中是否有键,因此返回rawgettbl,键是冗余的


您真正需要的是return Rect[key],它将像_index=tbl快捷方式一样在Rect表中查找值。

Lua在调用其_index元方法之前检查索引表中是否有键,因此return rawgettbl,key是多余的


您真正想要的是返回Rect[key],它将像_index=tbl快捷方式一样在Rect表中查找值。

确定猜测是否正确应该非常简单,只需打印传递的值和Rect表或直接测试它们是否相等即可。所以你应该能够很容易地做到这一点。尽管如此,我相信你是对的。@EtanReisner-是的,Rect通过了,我刚刚检查过。我以为实例表会被传递?一个_索引元方法会将与其关联的表传递给它。考虑到发生的事情是,你在你的例子中找不到钥匙,比如说,在索引表中查找它,在那里找不到它,然后在本例中为Rect的_索引表上调用_索引元方法。确定猜测是否正确应该非常简单,只需打印传递的值和Rect表或直接测试它们是否相等。所以你应该能够很容易地做到这一点。尽管如此,我相信你是对的。@EtanReisner-是的,Rect通过了,我刚刚检查过。我以为实例表会被传递?一个_索引元方法会将与其关联的表传递给它。考虑到发生的事情是,你在你的实例中找不到密钥,R,查找它,在索引中找不到它,然后在这个情况下调用在x索引表上的y-x索引元方法。这是真的,但是请记住这是一个ReCt Meta,而不是实例。缺少值的Rect[key]将导致堆栈溢出,因为将调用相同的_索引元方法。这里的建议是手动执行链接,而不是通过链接_索引表。因此,将该元表附加到您的实例,然后使用该返回行进行链接。至少据我所知。哦,天哪,我没想到。谢谢是的,但请记住这是一个Rect元表,而不是实例。缺少值的Rect[key]将导致堆栈溢出,因为将调用相同的_索引元方法。这里的建议是手动执行链接,而不是通过链接_索引表。因此,将该元表附加到您的实例,然后使用该返回行进行链接。至少据我所知。哦,天哪,我没想到。谢谢
Rect.__index = Rect