忽略 Lua 中的元表吗?

我正在开发一个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 ... 它总是为true。总是有一个子菜单,即使没有,因为菜单(self)找不到子菜单,它会检查它的元表,元表中有子菜单,然后在第11行,它为元表的子菜单循环。这意味着,它将再次绘制自己。一遍接一遍。那么有没有办法在一个地方绕过元表?或者我是不是正确的,重复打印是由此引起的?

原文链接 https://stackoverflow.com/questions/9447983

点赞
stackoverflow用户6236
stackoverflow用户6236
2012-05-05 04:19:23