Игнорирование метатабельных в Lua? - PullRequest
2 голосов
/ 26 февраля 2012

Я работаю над меню 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) не находит подменю, оно проверяет его метатабельность, которое имеет subMenu, а затем в строке 11 выполняет цикл for для своих подменю metatables,Это означает, что он снова нарисует себя.И опять.И опять.Так есть ли способ обойти метатабель, только в одном месте?Или я даже прав, это вызвано повторной печатью?

1 Ответ

3 голосов
/ 05 мая 2012

Использование rawget(table, index).

...