配列

Dの配列には静的動的の二種類があります。 配列へのあらゆるアクセスは境界チェックされています (コンパイラが境界チェックが不要だと証明できる場合を除く)。 境界チェックに失敗すると、アプリケーションを終了させるRangeErrorを発生させます。 勇敢な人は、安全性を犠牲にして速度を向上させるため、 このセーフティ機能を-boundschecks=offコンパイラフラグで無効化できます。

静的配列

静的配列は関数の中で定義された場合スタックに、そうでなければ静的メモリに保持されます。 その長さは固定されており、コンパイル時に判明しています。静的配列の型は固定のサイズを含みます:

int[8] arr;

arrの型はint[8]です。配列のサイズは型の次に表記され、 C/C++のように変数名の後には来ないことに注意してください。

動的配列

動的配列はヒープに保持され、実行時に伸び縮みできます。 動的配列はnew式と長さを使い作成します:

int size = 8; // 実行時変数
int[] arr = new int[size];

arrの型はint[]で、これはスライスといいます。 スライスは連続したメモリブロックに対するビューであり、 次のセクションでより詳細に説明されます。 多次元配列はauto arr = new int[3][3]構文で簡単に作成できます。

配列操作とプロパティ

配列は~演算子で結合でき、このとき新しい動的配列が作られます。

数学的演算がたとえばc[] = a[] + b[]のような構文を使って配列全体に適用できます。 これはabのすべての要素をc[0] = a[0] + b[0]c[1] = a[1] + b[1] などというように足し合わせます。配列全体と単一の値でも操作を行えます:

a[] *= 2; // すべての要素に2をかける
a[] %= 26; // aの全体にモジュロ26を計算する

これらの操作はそれを一度に行える特殊なプロセッサ命令を使うよう コンパイラが最適化するかもしれません。

動的配列、静的配列の両方に.lengthプロパティがあり、これは静的配列では読み込み専用ですが、 動的配列の場合そのサイズを動的に変更するのに使えます。.dupプロパティは配列のコピーを作ります。

arr[idx]構文で配列をインデクシングするとき、特殊な$記号は配列の長さを表します。 例えば、arr[$ - 1]は最後の要素を参照し、arr[arr.length - 1]を短縮したものです。

エクササイズ

encrypt関数を完成させて秘密のメッセージを暗号化しましょう。 テキストはシーザー暗号を使って暗号化されなければなりません。 これは特定のインデックスを用いてアルファベットの文字をシフトするものです。 暗号化されるテキストにはa-zの範囲の文字しか含まれていないため、 問題が簡単になるはずです。

解法はこちらで閲覧できます。

掘り下げる

rdmd playground.d