いつの間にか動的配列はCreateできるようになっていた。
type TIntArray = array of Integer; var IntArray: TIntArray; StrArray: TArray<string>; begin IntArray := TIntArray.Create(2, 3, 5, 7, 11,); // [2, 3, 5, 7, 11] StrArray := TArray<string>.Create('foo', 'bar'); // ['foo', 'bar'] end;
不覚にもこんな基本的な機能も知らなかったぜ…。Delphi2006で試しても通ったので相当前からあったみたい。さすがにDelphi6ではダメだったけど。
せっかくなので補足的なことも書いておくと、上のサンプルの1つ目(TIntArray.Createのほう)みたいに、何故か括弧内の最後にカンマがひとつ余ってても文法的に許されるらしい。ひょっとしたらこれも.NET互換的な目的で実装されたのかも。Cとかもそうだった記憶。
あと、
SetLength(IntArray, 5); IntArray[0] := 2; IntArray[1] := 3; IntArray[2] := 5; IntArray[3] := 7; IntArray[4] := 11;
このような動的配列Create実装以前の書き方のほうがコードの実行速度としては速い。
何故かというと、動的配列のCreateは、
- IntArrayに代入するための動的配列を一時的に別に作り
- それをクリアし(DynArrayClear)
- SetLengthで長さを確保し(DynArraySetLength)
- 引数として渡された値をそれぞれ代入し
- できあがったものをIntArrayに代入する(DynArrayAsg)
という処理になるのに対し、今までの書き方では、
- IntArrayをSetLengthで長さを確保し(DynArraySetLength)
- それぞれの値を代入する
だけで済むため。ただ、実用上でははっきり言って難癖レベル程度の違いしかないので、見た目にも分かりやすいCreateをばんばん使っちゃえばいいんじゃないかな。何となく。
個人的には『動的配列を引数として取りたいんだけど、テストやら何やらで定数値を渡したいがために仕方なく引数の型を動的配列ではなくオープン配列パラメータにしていたような関数』がうまく書けるようになってとっても嬉しいです。最近そんな関数書いた覚えはないけど。