我正在尝试计算飞行中矩形的顶部,底部,右侧和左侧属性,而不是将它们保留在表格中。
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表本身,因为调用是链接的。
答案 0 :(得分:4)
Lua在调用其__index
元方法之前检查密钥是否在索引表中,因此return rawget(tbl,key)
是多余的。
您真正想要的是return Rect[key]
,它会在Rect
表中查找__index=tbl
快捷方式中的值。