【问题标题】:Ignoring metatable in Lua?忽略 Lua 中的元表?
【发布时间】:2012-03-15 22:05:21
【问题描述】:

我正在开发一个 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 ... 它总是正确的。总是有一个子菜单,即使没有,因为菜单(自我)没有找到子菜单,它检查它的元表,它有子菜单,然后在第 11 行,它为它的元表子菜单执行 for 循环.这意味着,它会再次绘制自己。然后再次。然后再次。那么有没有办法在一个地方绕过元表?还是我说的对,是不是因为这个导致的重复打印?

【问题讨论】:

  • 发现有一个名为rawget(table, index) 的函数,它完全符合我的要求。很简单,只是无法从谷歌找到任何带有关键字“忽略元表lua”的信息......:“/
  • 如果您能自己回答这个问题并将其标记为已回答,那就太好了,这样其他搜索“Lua ignore metatable”的读者就会在这里得到一个可见的答案。

标签: lua draw metatable


【解决方案1】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 2011-03-11
    • 2019-02-17
    相关资源
    最近更新 更多