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