我正在开发一个Lua菜单,我有一个创建实例的Menu类,代码如下:
function Menu:new(label, action, open)
local inst = {
parent = self,
label = label,
action = action,
open = open or self.defaultOpenState,
current = false
}
setmetatable( inst, { __index = self } )
if self.subMenus then
table.insert( self.subMenus, inst )
else
self.subMenus = { inst }
end
return inst
end
这显然不是菜单的所有代码,但已足以解释我的问题。菜单正常工作,但打印菜单并不正常。问题在于,我使用递归方法来打印所有子菜单,但它一直重复打印第一个菜单。我知道是什么原因导致的,但不确定如何修复。以下是代码:
function Menu:draw(indent)
local indent = indent or 0
if self.label then
if self.current then
print( string.rep( " ", indent ) .. self:getDirectoryMark() .. "<" .. self.label .. ">" )
else
print( string.rep( " ", indent ) .. self:getDirectoryMark() .. " " .. self.label )
end
end
if self.subMenus and self.open then
for k, v in ipairs( self.subMenus ) do
v:draw( indent + 1 )
end
end
end
而问题是(如果我错了,请纠正我?),在第10行的
if self.subMenus ...
,它总是为真。即使没有子菜单,也会有一个子菜单,因为菜单(self)找不到子菜单,它会检查它的元表是否有子菜单,然后在第11行,它对其元表的子菜单进行循环。这意味着它会再次绘制自己。一遍又一遍。那么有没有办法在一个地方绕过元表?或者我是对的,重复打印是由此引起的吗?
rawget(table, index)
的函数,它恰好可以满足我的需求。这非常容易,只是我用关键词“ignore metatable lua”在Google上没有找到任何相关信息... :"/ - user1632861