Vector複製時のfixed

もしかして既によく知られていることなのかもしれませんが;

・出力結果

vector1はpop()やpush()をするとRangeErrorとなりますが、vector2はエラーがでません。
これはconcat()だけでなくslice()で複製した場合も同じで、要素のみコピーされるようです。
長さを固定したい場合は vector2.fixed = true; っていちいち書かないといけないのかな。

<追記>
kenさんのご指摘よりグローバル関数を使ってみると、、

・出力結果

trueになりました。kenさんに感謝!

ちなみにconcat()よりVector()で複製した方がどうやら高速のようで、
データ数が256個程度だと差は出ませんが、2^20個で試してみると40msほど違いました。
よって、Vectorを複製したい時はグローバル関数の Vector() を使うといいです。

あわせて読む:

4 Thoughts

  1. 偶然同じようなことを最近やっていたので。

    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()

  2. 上記書き込み不等号が消えてしまいました・・・。実態参照で書けば大丈夫かな・・・?

    var vector1:Vector.<Number> = new Vector.<Number>(256, true);
    var vector2:Vector.<Number> = Vector.<Number> (vector1)

    コメント欄汚してすみません。

  3. >> ken さん

    ご指摘ありがとうございます◎
    エントリーに追記しました。

  4. グローバル関数のVoctor()を使ったやり方だとコピーされずに引数がそのまま返されます
    古い記事ですが検索で上位に表示されてるので指摘しておきます

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です