7

私はCodeaiPadアプリを使用していて、Luaを学習しています。CodeaはクラスにClass.luaを使用します。私が達成しようとしているのは、変数のgetメソッドとsetメソッドの関数を指定する方法です。現在、「x」という変数は次のようにアクセスできます:print(obj.x)そして次のようなコードで設定します:obj.x =1。代わりに、指定できるgetおよびset関数を変数に呼び出したいと思います。 。Actionscript 3で記述されたものを移植しており、A3のgetおよびset関数宣言を模倣する必要があります。これが可能かどうか、または別の方法かどうかを教えてください。コードを追加または変更することが解決策である場合は、CodeaのClass.luaをオーバーライドできます。ありがとう。

4

1 に答える 1

10

クラスの __newindex および __index メソッドをオーバーライドすることにより、カスタム セッターおよびゲッターを作成できます。

rawset メソッドと rawget メソッドを有効にするには、Codea の一部である LuaSandbox.lua を変更する必要があることに注意してください (それらを nil に設定する行をコメントアウトします)。編集: これは Codea の最新バージョンではもはや当てはまらず、デフォルトで利用可能です。rawsetrawget

テーブルにまだ設定されていないプロパティを設定しようとすると、常に __newindex メソッドが呼び出されます。

テーブルに存在しないプロパティを取得しようとすると、__index メソッドが呼び出されます。

そのため、クラスにプライベート テーブルを作成し、そこにメンバー変数を格納することで、ゲッターとセッターのカスタム コードを挿入できます。それらを読み書きしようとすると、__newindex および __index メソッドでカスタム コードを実行できます。

MyClass = Class()

function MyClass:init()
    -- We'll store members in an internal table
    self.members = {}
end

function MyClass:__newindex( index, value )
    if index == "testMember" then
        self.members[index] = value
        print( "Set member " .. index .. " to " .. value )
    else
        rawset( self, index, value )
    end
end

function MyClass:__index( index )
    if index == "testMember" then
        print( "Getting " .. index )
        return self.members[index]
    else
        return rawget( self, index )
    end
end

テストするには

function setup()
    foo = MyClass()

    foo.testMember = 5
    foo.testMember = 2

    print( foo.testMember )
end

メタメソッドの詳細については、 http ://lua-users.org/wiki/MetamethodsTutorial を参照してください。

于 2012-05-14T11:05:00.047 に答える