在Lua中忽略元表?

3

我正在开发一个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行,它对其元表的子菜单进行循环。这意味着它会再次绘制自己。一遍又一遍。那么有没有办法在一个地方绕过元表?或者我是对的,重复打印是由此引起的吗?

4
发现Lua中有一个名为rawget(table, index)的函数,它恰好可以满足我的需求。这非常容易,只是我用关键词“ignore metatable lua”在Google上没有找到任何相关信息... :"/ - user1632861
4
如果您能回答这个问题并将其标记为已解答,那就太好了,这样其他搜索“Lua忽略元表”答案的读者就可以在这里看到一个可见的答案。 - Michal Kottman
1个回答

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接