首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略Lua中的metatable?

忽略Lua中的metatable?
EN

Stack Overflow用户
提问于 2012-02-26 04:57:10
回答 1查看 488关注 0票数 3

我正在做一个Lua菜单,我得到了menu类,它创建了这样的实例:

代码语言:javascript
复制
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

这显然不是菜单的所有代码,但这足以解释我的问题。菜单工作得很好,但打印效果却不好。问题是,我使用递归方法打印出所有的子菜单,但它一遍又一遍地打印第一个菜单。我知道它的原因,但不确定如何修复它。代码如下:

代码语言:javascript
复制
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 ...中,它总是正确的。总是有一个菜单,即使没有,因为subMenu (self)没有找到一个子菜单,它检查它的metatable,它有subMenu,然后在第11行,它为它的metatables子菜单执行for循环。也就是说,它会再一次画出来。一遍又一遍。一遍又一遍。那么有没有一种方法可以只在一个地方绕过metatable呢?或者我是对的,重复打印是由它引起的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-05 12:19:24

使用rawget(table, index)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9447983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档