もしかして既によく知られていることなのかもしれませんが;
1 2 3 4 5 |
var vector1:Vector.<Number> = new Vector.<Number>(256, true); ・・・ var vector2:Vector.<Number> = vector1.concat(); // vector1を複製 trace(vector1.fixed, vector1.length); trace(vector2.fixed, vector2.length); |
・出力結果
1 2 |
true 256 false 256 |
vector1はpop()やpush()をするとRangeErrorとなりますが、vector2はエラーがでません。
これはconcat()だけでなくslice()で複製した場合も同じで、要素のみコピーされるようです。
長さを固定したい場合は vector2.fixed = true; っていちいち書かないといけないのかな。
<追記>
kenさんのご指摘よりグローバル関数を使ってみると、、
1 2 3 4 5 |
var vector1:Vector.<Number> = new Vector.<Number>(256, true); ・・・ var vector2:Vector.<Number> = Vector.<Number>(vector1); // vector1を複製 trace(vector1.fixed, vector1.length); trace(vector2.fixed, vector2.length); |
・出力結果
1 2 |
true 256 true 256 |
trueになりました。kenさんに感謝!
ちなみにconcat()よりVector()で複製した方がどうやら高速のようで、
データ数が256個程度だと差は出ませんが、2^20個で試してみると40msほど違いました。
よって、Vectorを複製したい時はグローバル関数の Vector() を使うといいです。
偶然同じようなことを最近やっていたので。
concatメソッドは複製ではなく本来連結のためのメソッドなので、fixedが引き継がれないのだと思います。(というよりは連結する際に長さが変わるので基本的にfixedはあえてfalseになっているのかと思います。)
(あまり深く試してないですが)以下のような形で上手くいきそうな気がします。ご参考までに。
var vector1:Vector. = new Vector.(256, true);
var vector2:Vector. = Vector.(vector1)
Vector() グローバル関数
http://livedocs.adobe.com/flex/3_jp/langref/package.html#Vector()
上記書き込み不等号が消えてしまいました・・・。実態参照で書けば大丈夫かな・・・?
var vector1:Vector.<Number> = new Vector.<Number>(256, true);
var vector2:Vector.<Number> = Vector.<Number> (vector1)
コメント欄汚してすみません。
>> ken さん
ご指摘ありがとうございます◎
エントリーに追記しました。
グローバル関数のVoctor()を使ったやり方だとコピーされずに引数がそのまま返されます
古い記事ですが検索で上位に表示されてるので指摘しておきます