2

次の Lua メタテーブル クラスがあります。デストラクタを追加して、特定の条件が発生したときに、作成されたオブジェクトを破棄し、その値を nil に設定するにはどうすればよいですか?

-------------------------------------------------
-- Arrow class
-------------------------------------------------

local arrow = {}
local arrow_mt = { __index = arrow } -- metatable

function arrow.new(x, y) -- constructor
    local newArrow = {
        position = { x = x, y = y }
    }

    return setmetatable( newArrow, arrow_mt )
end

function arrow:remove()
    -- remove the object here
    -- self = nil dosent work
end
4

2 に答える 2

5

Nicol が言ったように、変数がオブジェクトへの参照を取得すると、オブジェクト自体は変数を制御できません (つまり、値をnilに設定します)。実際、これは良いことです。誰かがあなたのオブジェクトへの参照をローカル変数に保存したと想像してください。突然、不明な時点でnil参照になり (別の場所で破棄されるため)、それ以上アクセスするとエラーになります。

それは残念です。オブジェクトをすぐに破壊する必要があります。

本当にオブジェクトを破棄する必要がありますか? なんで?Lua ガベージ コレクタは正しく動作していませんか? オブジェクト間の関係を設計する別の方法はありませんか?

たとえば、最も単純なケースでは、ガベージ コレクションを強制的に実行できますcollectgarbage("collect")。ガベージ コレクションは、強い参照を持たないすべてのオブジェクトを消去します。本当に変数を消したい場合は、それらを弱いテーブルに保管してください。もちろん、オブジェクトを割り当てている間 (停止しない限り)、Lua は自動的にガベージ コレクションを行います。ガベージ コレクションの速度を変更することもできます。

于 2011-12-06T15:20:46.643 に答える
1

できません。Lua は C/C++ ではありません。ガベージ コレクションを使用します。したがって、ガベージ コレクションに頼る必要があります。オブジェクトのユーザーは、オブジェクトがいつ消えるかを制御できます。それが終わったら、それへの参照を破棄するのは彼ら次第です。

したがって、明示的な「新規」を持つことはできますが (そう呼ぶべきではありません)、明示的な「削除」を持つことはできません。オブジェクトが参照されなくなると、破棄が発生します。

于 2011-12-05T22:01:26.060 に答える