イナヅマTVログ

ActionScript 3, 配列を定数にしても参照側から書換えられる

| 3件のコメント

AS 3, ActionScript 3 の定数はスカラに限らず、Array, Object, Vector….などほぼどんな型でも宣言可能です。

配列など参照渡しになる型の使用には注意が必要なようです。
参照側でデータ変更が行われると定数宣言をしていても値の変更が行われます。
エラーは発生しません。

package  {
	public class Fruits extends Object {
 
		public static const BASKET:Array = ['apple','banana','melon'];
 
		public function Fruits() {
		}
	}
}
var clone:Array = Fruits.BASKET.concat();
trace(Fruits.BASKET); //apple,banana,melon
clone[0] = 'スイカ'; 
trace(Fruits.BASKET);//apple,banana,melon
 
var reference:Array = Fruits.BASKET;
trace(Fruits.BASKET); //apple,banana,melon
reference[0] = 'マンゴ';
trace(Fruits.BASKET); //マンゴ,banana,melon

参照だからこうなって当たり前なんでしょうけどねぇ…
定数宣言してるからって気を抜いちゃうとひどい目にあいそうです。

変数へ代入したいときはちゃんと複製処理しないといけません。
以前投稿したコチラをご利用ください。
ActionScript 3, ArrayとObjectのクローン(複製・コピー・copy)を作る

update 2011-05-18
ちょっと気になることが…
ActionScript 3 は定数にスカラ以外も設定できるけど、これは矛盾を生んでいる気がしてきた。
いっそはっきり「できない」「エラー」にしたほうが整合性がとれるように思えます。

そこは現場力でなんとか乗り切る手段を考えなくては
現場対応としては、

定数はリテラルに限る。

完全に書替え不可な定数的な扱いの配列型の作成は、一回だけ値を設定できる変数にする。

次に続く・・・ActionScript 3, 定数のように扱える配列型変数のお勉強

3件のコメント

  1. ミュータブルな値の参照を外に出す時は、
    getや関数を介してクローンを返すのは配列に限らずですね。
    自分の場合はsliceで返しています。
    JavaとかC++からAS3に入った人は、結構気づかない人が多いので、
    ライブラリや共通部品を作る時は、メチャメチャ気をつけています。
    平気で参照を壊す人が多いので。。。

  2. ピンバック: ActionScript 3, 定数のように扱える配列型変数のお勉強 | イナヅマtvログ

  3. ミュータブル <-> イミュータブル
    Wikipedia イミュータブル の話ですね。
    勉強になります。

コメントを残す

必須欄は * がついています


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください