ActionScript3のsetメソッドの返り値
Posted by hikaruworld : 2008 12月 9
つまり、AS3のsetメソッド(public function set hoge)は返り値を持つらしい。
詳説ActionScript3 の 3.4 getメソッドとsetメソッドの79Pの下部に、以下のような記述がある。
setメソッドは、呼び出されると、それに対応するgetメソッドを常に呼び出し、getメソッドの戻り値を返します。
これによりプログラムでは、新しい値の設定後すぐにその値を使うことができます。…<中略>…
値を返すsetメソッドの機能は便利に使える一方で、getメソッドに制限を加えています。
特にgetメソッドでは、内部的な変数の値の取得に必要な程度を超える作業は絶対に行うべきではありません。…<中略>…
setメソッドによるgetメソッドの自動的な呼び出しによって、カウンタの記録の追跡が損なわれることになります。
まさか、voidで実装しているsetに返り値があるとは知らなかった。
試しにサンプルを書いてみる。
package { import flash.display.Sprite; public class Zoo extends Sprite { public function Zoo() { var p:Hoge = new Hoge(); trace((p.piyo = "test").length); } } } class Hoge { private var _piyo:String; public function get piyo():String { trace("get"); return _piyo; } public function set piyo(piyo:String):void { trace("set"); _piyo = piyo; } }
上記のコードでは、Hogeクラスの_piyoプロパティにsetメソッドを使用して値を設定しているが、
setメソッドによる値の設定を行うと、
p.piyo = “test”
を行った際に返り値を取得できるので、こんな感じでHoge.piyoの返り値を処理できる(traceの結果は4)。
trace((p.piyo = “test”).length);
これって常識なのかな?
今までget/setはgetter/setter的にしか使ってなかったから大丈夫だけど、しらなかったょ。
ただ、このサンプルだと以下のように表示されると思っていたんだが、
set
get
4
実際は、以下のような感じで出力された。
set
4
という事は、必ず、getメソッドととして明示的に呼ばれる訳ではないという事なのかな?
気になる。
とりあえず、flash.sampler.getGetterInvocationCount()で実行されたgetメソッドの回数を測定してみる。
以下のようにソースを修正して実行(修正したコンストラクタのみ抜粋)。
public function Zoo() { var p:Hoge = new Hoge(); trace((p.piyo = "test").length); var piyoName:QName; for each (var name:QName in getMemberNames(p)) { if (name.localName == "piyo") { piyoName = name; } } if (isGetterSetter(p, piyoName)) { trace(getGetterInvocationCount(p, piyoName)); trace(getSetterInvocationCount(p, piyoName)); } }
結果。
set
4
0
1
やっぱり呼ばれていないよ。
うーん。わからん。。。
shoito said
class Hogeかget piyoに[Bindable]メタタグを付けてあげると予想通りの動きになるのではないでしょうか?
prepro said
> Shoito さん
なるほど、ありがとうございます。ちょっと試してみます。
しかし、ASDocのsetを見ても
としか書いてないんですよね。。。
coelacanth said
これ確かに詳説ActionScript3通りの動きにならないですね。CS系だと書籍どおりに動くとか、翻訳ものなので現バージョンでは動作が違うという可能性もリ???
prepro said
> coelacanth さん
代入時の挙動と同じ(var a = “hoge”した場合に戻り値として”hoge”が取れる)なら理解できるんですが、
ここでは、getが呼ばれると書いてありますからね。
FlashPlayer10だと挙動が違うのかな。。。
とりあえずshoitoさんの件は、今日試してみます。