[Astro] Vector クラス(3) ~コピー~
2008/05/24 13:16 - Astro
Flash Player 10 から使えるようになった Vector クラス の確認。
今回はコピーについて。
まずは、等号によるコピーは、当然、シャローコピーになるであろうことを確認します。
trace 結果 vec2 = vec1 直後 vec1: 3,8,17 vec2: 3,8,17 -------- vec2[i] を変更した後 vec1: 99,2,0 vec2: 99,2,0
vec2 の要素を変更したら vec1 も変更されました。予期どおりの動きです。
じゃ、ディープコピーはどういうコードを書くのかしら。
添え字アクセスや for each in によるアクセスで1件ずつやればディープコピーできますが、そんなめんどくさい事したくねっす。
Array は concat() を使えば一発でディープコピーができましたね。
ASDoc によると Vector にも concat() メソッドがあるので、こいつでディープコピーを試してみます。
Array だったらこう書けばディープコピーができました
var arr1:Array = [ 1, 2, 3 ]; var arr2:Array = arr1.concat();
Vector だとこうなるのかな?
var vec1:Vector.<uint> = new Vector.<uint>(); vec1[0] = 3; vec1[1] = 8; …… var vec2:Vector.<uint> = vec1.concat();
試してみたらダメでした。
静的型 __AS3__.vec:Vector$object の値が、関連しない可能性が高い型 __AS3__.vec:Vector.<uint> に暗黙で型変換されています。
このエラーメッセージは「B = A というコードを記述しているけど、型違いのデータだから代入できないよ」ということですよね。
つまり「vec1.concat() は Vector$object を返すけど、それは Vector.<uint> じゃないよ」と。
ASDoc によると Vector.concat の Usage は以下のようになってます。
concat(... args):Vector
Vector 型を返しているけど、要素の型を指定する .<type> はありませんね。
で、ネット上あちこち拝見した結果、どうやら Vector.concat() の返り値を、Vector.<type> で改めてキャストするっぽい。
ダメだったコードを書き直してパブリッシュしてみます。
今度は期待どおりの結果となりました。 でも、こういうやり方が開発者サイドによって想定されたものなのか否かは、ちょっと分かりません。
乞うご助言。
シリーズ
- Vector クラス(6) ~Vector を返す関数~
- Vector クラス(5) ~多次元配列~
- Vector クラス(4) ~生成時に要素格納~
- Vector クラス(2) ~要素へのアクセス~
- Vector クラス(1)