【发布时间】:2014-08-07 01:41:34
【问题描述】:
我正在尝试即时计算矩形的顶部、底部、右侧和左侧属性,而不是将它们保留在表格中。
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 元表中,因为 _index 方法可以被链接起来。
结果是 __index 被调用但表错误。它崩溃是因为 tbl.x 和 lua 无法用它执行算术运算。我的猜测是传递的表是 Rect 表本身,因为调用是链式的。
【问题讨论】:
-
确定你的猜测是否正确应该像打印出传递的值和
Rect表一样简单(或直接测试它们是否相等)。所以你应该能够很容易地做到这一点。话虽如此,我相信你是对的。 -
@EtanReisner - 是的,Rect 已通过,我刚刚检查过。我以为实例表会通过?
-
一个
__index元方法获取与其关联的表并传递给它。考虑到发生的情况是您未能在您的实例中找到密钥(r说),在__index表中查找它,未能在那里找到它,然后调用__index元方法__index表(在本例中为Rect)。
标签: lua