3

私は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か所でバイパスする方法はありますか?それとも私も正しいですか、それが原因で繰り返し印刷されているのでしょうか?

4

1 に答える 1

4

を使用しrawget(table, index)ます。

于 2012-05-05T04:19:23.703 に答える