ActionScriptでディープコピー
上記のActionScriptでのオブジェクトのディープコピーについてのエントリを読みました。
もともとディープコピーを使う機会が無かったので、気づかずに通り過ぎていましたが、ActionScriptのコピー演算子ってシャローコピーなのですね。
そこで、上記エントリではAS3でディープコピーを行う手段を載せておられますが、そのコードはほぼ同じものがFlashCS3のヘルプ「配列のコピー」というページにも載っていました。
検証
以下のスクリプトで、ヘルプに載っていたコードの検証を行ってみました。
/* TestCopy.as */ package { import flash.display.Sprite; import flash.utils.ByteArray; public class TestCopy extends Sprite { /** * コピーテストを行います. */ public function TestCopy() { // オブジェクト. var arr:Array = [0,1,2,3]; // シャローコピーしたオブジェクト. var arrShallowCopy:Object = arr; // ディープコピーしたオブジェクト. var arrDeepCopy:Object = clone(arr); // コピー元の要素を変えてみます. arr[3] = 'a'; // それぞれ確認. trace( arr[3] ); //=> 'a' trace( arrShallowCopy[3] ); //=> 'a' trace( arrDeepCopy[3] ); //=> '3' } /** * ディープコピーを行います. */ public static function clone( arg:* ) :* { var myBA:ByteArray = new ByteArray(); myBA.writeObject(arg); myBA.position = 0; return( myBA.readObject() ); } } }
fdbで実行すると、ソースに書いたようなtrace出力が行われ、「通常のコピーではシャローコピー、作成したメソッドcloneを使ったらディープコピーが行われる」ことが確認されました。