A.S.3は値渡しなのか?
id:flashrodさんの記事、2008-01-27 - flashrod - AS3では関数の引数はすべて値渡し(call by value)であるについて。
こういうのは一般には参照渡しと言うんでしょうが、参照変数を値渡ししているとも言えるんでしょうね。AS3だけでは分かりにくいので、ちょっとC++を混ぜて考えます。
クラスからオブジェクト(インスタンス)を生成するところをAS3とC++で併記します。
var a:Hoge = new Hoge(); // AS3 Hoge* a = new Hoge(); // C++
AS3では型HogeをnewしたときにはHoge型に格納されますが、C++だとHoge*型に格納されます。なので、AS3のHoge型とC++のHoge*型は同じと見ることができます。さて、問題のswap関数ですが、両方の言語で書くと
// AS3 function swap(a:Hoge, b:Hoge):void { var tmp:Hoge = a; a = b; b = tmp; } // C++ void swap(Hoge* a, Hoge* b) { Hoge* tmp = a; a = b; b = tmp; }
となります。これではスワップできてません。C++のほうの引数はHoge型ではなくHoge*型にしていますが、これは先ほど書いたとおり、AS3のHogeとC++のHoge*を等価に見ているからです。そんなわけでC++的参照渡し。
void swap(Hoge*& a, Hoge*& b) { Hoge* tmp = a; a = b; b = tmp; }
これでスワップできます。これこそid:flashrodさんの言う参照渡しということではないでしょうか。そういう意味では、AS3は値渡しであると言う事もできると思います。