私はCodeaiPadアプリを使用していて、Luaを学習しています。CodeaはクラスにClass.luaを使用します。私が達成しようとしているのは、変数のgetメソッドとsetメソッドの関数を指定する方法です。現在、「x」という変数は次のようにアクセスできます:print(obj.x)そして次のようなコードで設定します:obj.x =1。代わりに、指定できるgetおよびset関数を変数に呼び出したいと思います。 。Actionscript 3で記述されたものを移植しており、A3のgetおよびset関数宣言を模倣する必要があります。これが可能かどうか、または別の方法かどうかを教えてください。コードを追加または変更することが解決策である場合は、CodeaのClass.luaをオーバーライドできます。ありがとう。
1 に答える
クラスの __newindex および __index メソッドをオーバーライドすることにより、カスタム セッターおよびゲッターを作成できます。
rawset メソッドと rawget メソッドを有効にするには、Codea の一部である LuaSandbox.lua を変更する必要があることに注意してください (それらを nil に設定する行をコメントアウトします)。編集: これは Codea の最新バージョンではもはや当てはまらず、デフォルトで利用可能です。rawset
rawget
テーブルにまだ設定されていないプロパティを設定しようとすると、常に __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 を参照してください。