[Astro] Vector クラス(4) ~生成時に要素格納~
2008/05/25 19:09 - Astro
今さら言うまでもないことですが、Array は生成の際に要素を指定・格納することができます。
var arr:Array = new Array( "a", "b", "c" ); var arr:Array = [ "a", "b", "c" ];
対して Vector は生成時、上記で示した Array のようにコンストラクタの引数、あるいは [ ] を使って要素を指定・格納することはできないとのこと。
ところで、前回の最後で、ディープコピーの場合は concat の返り値をキャストするというのをやりましたが、このキャストを応用すれば、Vector も生成時に要素の指定・格納がおこなえるという認識で良いんですかね。
原理原則的な記述をすると、まずはこういうコードになると思います。
<A> (1) var arr:Array = [ "superbia", "invidia", "ira", "acedia", "avaritia", "gula", "luxuria" ]; (2) var vec:Vector.<String> = Vector.<String>( arr );
でも(1)の右辺を、(2)の ( ) 内に直接代入する記述をしても問題ないですよね? こんな感じに。
<B> var vec:Vector.<String> = Vector.<String>([ "superbia", "invidia", "ira", "acedia", "avaritia", "gula", "luxuria" ]);
<B>で書いた上記ソースコードをコンパイルすると、期待どおりの結果が出ます。 しかし気になるのは<B>のコーディングをしたとき、右辺( ) 内に記述された Array オブジェクトが、この式の終了後、ガベージコレクションの対象になるのかどうかです。
<A>の場合、(2)の式の後に arr = null; を記述することで、arr を明示的にガベージコレクションの対象にできるんだと理解してますが、<B>のコーディングでは Array オブジェクトは匿名だから、アクセス手段が存在せず、ユーザが明示的に参照を切ることができないってことですよね。
でも<A>における arr をキャストした vec は、arr からのディープコピーになっているということを考えると、<B>の匿名 Array は以後どこからも参照されないということなので、やっぱりガベージコレクションの対象になるってことでいいんでしょうか。
シリーズ
- Vector クラス(6) ~Vector を返す関数~
- Vector クラス(5) ~多次元配列~
- Vector クラス(3) ~コピー~
- Vector クラス(2) ~要素へのアクセス~
- Vector クラス(1)