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のHogeC++Hoge*を等価に見ているからです。そんなわけでC++的参照渡し。

void swap(Hoge*& a, Hoge*& b) {
  Hoge* tmp = a; a = b; b = tmp;
}

これでスワップできます。これこそid:flashrodさんの言う参照渡しということではないでしょうか。そういう意味では、AS3は値渡しであると言う事もできると思います。