私は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 ...
では常に真実であるということです。subMenuは常に存在しますが、存在しなかった場合でも、メニュー(self)はサブメニューを検出しないため、subMenuを持つメタテーブルをチェックし、11行目でメタテーブルサブメニューのforループを実行します。 。つまり、それは再び自分自身を描画します。そしてまた。そしてまた。では、メタテーブルを1か所でバイパスする方法はありますか?それとも私も正しいですか、それが原因で繰り返し印刷されているのでしょうか?