Haxeメモgetter/setterとReflection
たまには技術エントリー。最近はキータとか流行ってるらしいですね。
HaxeでTween処理を行いたい場合、AS/JSと同様にオブジェクトの任意のプロパティにアクセスします。
たとえばAS/JSで以下のような処理を行うとすると、
この場合、内部的に
Spriteは、flashのビルトインクラス(flash.diplay.Sprite)なので当然といった感じがしますが、Haxeで書かれたクラスに関しても同様にset_x/get_xがcallされます。
ここで注意が必要なのが、よく似た機能を提供する Reflect.setField() というmethodです。
こちらはgetter/setterを利用してくれません。特にJSの場合だとシレっと'x'プロパティを追加したりします。このmethodの使い方はObjectクラスのパラメータを操作するのが多分ベターかと。実はこれを一番言いたかったんだけど、最後になってしまった。
HaxeでTween処理を行いたい場合、AS/JSと同様にオブジェクトの任意のプロパティにアクセスします。
たとえばAS/JSで以下のような処理を行うとすると、
var sp:Sprite=new Sprite(); sp['x'] = 20;Haxeだとこうなります。
var sp:Sprite=new Sprite(); Reflect.setProperty(sp,'x',20);HaxeではAS/JSの様に気安くプロパティに触らせてくれないので、Reflectクラスを使います。 Reflect.setProperty()を使った処理では、対象オブジェクトのプロパティがgetter/setterで定義されていた場合も、実装者の意図に沿った処理が走ります。
この場合、内部的に
function set x(v:Number):voidを実行してくれます。
Spriteは、flashのビルトインクラス(flash.diplay.Sprite)なので当然といった感じがしますが、Haxeで書かれたクラスに関しても同様にset_x/get_xがcallされます。
@:isVar public var x(get, set):Float; public function get_x() public function set_x(i:Float)これでいい感じのTweenエンジンが作れますね。
ここで注意が必要なのが、よく似た機能を提供する Reflect.setField() というmethodです。
こちらはgetter/setterを利用してくれません。特にJSの場合だとシレっと'x'プロパティを追加したりします。このmethodの使い方はObjectクラスのパラメータを操作するのが多分ベターかと。実はこれを一番言いたかったんだけど、最後になってしまった。