Я работаю над меню 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)
, которая делает именно то, что я хочу. Было довольно просто, просто не смог найти никакой информации в Google с ключевыми словами игнорировать метатабличный lua ... :/ - person   schedule 26.02.2012