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


person Community    schedule 25.02.2012    source источник
comment
Обнаружил, что есть функция под названием rawget(table, index), которая делает именно то, что я хочу. Было довольно просто, просто не смог найти никакой информации в Google с ключевыми словами игнорировать метатабличный lua ... :/   -  person    schedule 26.02.2012
comment
Было бы здорово, если бы вы сами ответили на этот вопрос и отметили его ответом, чтобы другие читатели, ищущие Lua, игнорировали метатаблицы, оказались здесь с видимым ответом.   -  person Michal Kottman    schedule 26.02.2012


Ответы (1)


Используйте rawget(table, index).

person Alexander Gladysh    schedule 05.05.2012
comment
Добавлен ответ для пользы сообщества. @Mahi, оставьте комментарий здесь, если вы хотите правильно добавить свой ответ, я удалю свой. (Похоже, вы этого не сделаете, так как здесь не было активности в течение нескольких месяцев.) - person Alexander Gladysh; 05.05.2012