@Constantinerは正しい方向に進んでいると思いますが、彼の説明には詳細が欠けていると思います。ですから、もう少し詳しく説明しようと思います。最善の方法で私はそれを理解しています。私が間違っていれば、Yaは私を訂正することができます。
ドキュメントに記載されているように:
ActionScript 3.0では、すべての値がオブジェクトとして保存されるため、すべての引数は参照によって渡されます。ただし、Boolean、Number、int、uint、およびStringを含むプリミティブデータ型に属するオブジェクトには、値によって渡されたかのように動作させる特別な演算子があります。
したがって、ArrayCollectionは間違いなくオブジェクトであり、プリミティブ型ではないため、参照によって渡され、参照によって渡されたように動作する必要があります。しかし、ArrayCollectionへの参照変数は何ですか。概念的には、実際のコレクションデータを含むメモリスペースへのポインタにすぎません。これがいくつかのASCIIアートでの私の試みです:
|---|
ac1(variable)--> | | (ActualArrayCollection1)
|---|
|---|
ac2(variable)--> | | (ActualArrayCollection2)
|---|
繰り返しますが、ac1variableはメモリ空間へのポインタです。ac2variableは、いくつかの異なるメモリ空間へのポインタです。それらの1つを引数としてメソッドに渡すと、参照によって渡されます。したがって、メソッド内には、次のようなものがあります。
ac1(variable)--> |---|
ac1(argument)--> | | (ActualArrayCollection1)
|---|
ac2(variable)--> |---|
ac2(argument)--> | | (ActualArrayCollection2)
|---|
したがって、ac1variableとac1argumentの両方が同じメモリ空間を指します。それぞれに同じポインタ値が含まれているためです。ただし、ac1variableとac1argumentは、実際には異なるメモリスペースを保持しています。それらは同じではありません。
メソッドがこの行を実行するとき:
_ac2 = _ac1;
あなたはこのようなものを手に入れます:
ac1(variable)--> |---|
ac1(argument)--> | | (ActualArrayCollection1)
ac2(argument)--> |---|
ac2(variable)--> |---|
| | (ActualArrayCollection2)
|---|
メソッドの実行が終了すると、2つの引数はなくなり、元のポインター変数は変更されません。メソッド内でこのような直接割り当てを行う場合は、thisキーワードを使用してグローバル変数にアクセスできます。これはそれを行う必要があります:
this._ac2 = _ac1;
もちろん、クラスレベルの変数にアクセスしている場合は、メソッド内のカプセル化の目的が損なわれる可能性があります。
コンパイラー設計の専門家とかそういうものが朝食にこれを食べて吐き出すと確信しています。私のASCIIアートが複数のブラウザ/マシン/OSなどで一貫していることを願っています。