ActionScript3では、関数の引数は基本的に参照渡しとのこと。
http://livedocs.adobe.com/flash/9.0_jp/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000055.html
値はすべてオブジェクトとして格納されているので、すべてのパラメータは参照渡し。
ただ、Boolean,Number,int,uint,Stringなどのプリミティブデータ型に属するオブジェクトについては、値渡しのように動作する。
function test( val:int ):void {
//valは値渡しなので呼び出したときの引数m_valのコピーが渡されてきている
val++;
}
var m_val:int = 1;
test( m_val );
trace( m_val );
ってやってtraceしてみるとm_valは1。関数testの引数には値渡しなのでコピーが作成されるってことか。
うーーん。でも関数内で値変更したいってときもあるだろうに。
Adobe Docsを見てもわかるとおり、Object型とかで宣言しすればOK。
function test2( obj:Object ):void {
//objは参照渡しなのでm_objを見ている
obj.val++;
}
var m_obj:Object = {val:1};
test2(m_obj);
trace( m_obj.val );
これで、trace結果は2になる。
これだと、Object型で宣言しなきゃダメになっちまう。プリミティブ型をオブジェクトに一時的にキャストしてしまえばいいと思うのだが。うーん、自分の能力足らず・・・誰か知っていたら教えてください。
今回の例なら戻り値でOKだが、引数が複数になってそのうちのいくつかってなったらねぇ・・・
この記事が気に入ったりした方は、自分のブログを書くときに「下のURLをコピーして、自分のブログ投稿時のトラックバック欄にペースト」してください。つながります。
URL: