0

スクリプト内に「疑似 oop」システムをセットアップして、アプリケーションから UserData をより適切に操作できるようにしました。私のシステムは、参照を渡さず、値を渡すことを除いて、非常にうまく機能します。このため、次のようなことを言うと:

World.Body.Parent=World.Body2

Bodys 親を実際に他のボディに設定することはないため、実際には何も起こりません。代わりに、次のように単純化します。

World=World.Body2

(Worldは の親であるBodyため、返されます)。一方、このようなことをすると、次のようになります。

print(World.Body.Parent.Type)

==>World

Worldオブジェクトを正しく取得したためです(の親ですBody)。

これをすべて念頭に置いて、実際にオブジェクトを送信するのではなく、参照によって渡されることを確認する方法はありますか? どんなアイデアでも大歓迎です!

私が使用している関連するソースコードは次のとおりです。

local target=_G

function AddService(service)
    Blank=(function(...) return end)
    CreateTemporaryIndex=(function(obj)
        local env_meta={
            __index=(function(this, key)
                if obj[key]~=nil and obj[key]~=key then
                    if type(obj[key]) ~= "userdata" then
                        return obj[key]
                    else
                        local r,i=pcall(function() Blank(obj[key].Type) end)
                        if r then
                            return CreateTemporaryIndex(obj[key])
                        else
                            return (function(...) local arg={...} table.remove(arg,1) return obj[key](obj,unpack(arg)) end)
                        end
                    end
                else
                    local ofObj=obj:Child(key)
                    if ofObj~=nil then
                        return CreateTemporaryIndex(ofObj)
                    end
                end
                return nil
            end)
        }
        local nRe={}
        setmetatable(nRe,env_meta)
        return nRe
    end)
    target[service.Name]=CreateTemporaryIndex(service)
end

AddService(__Environment.World)
AddService(__Environment.Players)
AddService(__Environment.Lighting)
AddService(__Environment.Environment)
4

1 に答える 1

2

__indexメタメソッドは、プロパティにアクセスするときにのみ呼び出されますカスタムセッターを実装するには、 __newindexメタメソッドも定義する必要があります。私がリンクしたLuaマニュアルのセクションで詳細を見つけることができます。

そうは言っても、もし私があなたなら、このプロキシテーブルの複雑さのすべてが本当に必要かどうかをもう一度考えます。カバーしなかった可能性のある小さなコーナーケースの1つの例として、__ipairsおよび__pairsメタメソッドも追加しない限り、ペアとipairを使用して環境を反復処理すると失敗します。

于 2012-07-29T04:53:05.943 に答える