可変性

Dは静的型付き言語です: 一度変数が宣言されたあと、それ以降その型は変更できません。 これはコンパイラに早期にバグを防止させることを可能にし、コンパイル時に制限を実施します。 優れた型安全は大きなプログラムをより安全に、 より保守性を高く作るというニーズに対してのサポートを提供します。

Dにはいくつか型修飾子がありますが、もっとも一般的に使用されるのは constimmutableです。

immutable

静的型付けシステムに加えて、Dは特定のオブジェクトに追加の制約を適用する 型修飾子(時々型コンストラクタとも呼ばれる)を提供します。たとえば immutableなオブジェクトは一度だけ初期化でき、 その後変更できません。

immutable int err = 5;
// or: immutable err = 5 and int is inferred.
err = 5; // won't compile

immutableなオブジェクトは定義上変更されないので、 例えば異なるスレッド間で同期なしで安全に共有できます。これは、immutable なオブジェクトが完全にキャッシュされうることも意味します。

const

constなオブジェクトも変更ができません。この制限はカレントスコープでのみ有効です。 constなポインタはミュータブルまたはimmutableなオブジェクトのどちらからでも作ることができます。 これは、カレントスコープでオブジェクトがconstでも、 違うコンテキストで誰かが変更するかもしれない、ということを意味します。 APIが同じ関数で変更可能と不可能両方のデータを処理するために、 constな引数を受け入れそれを変更しないことを保証するのは一般的なことです。

void foo(const char[] s)
{
    // コメントアウトしないと、
    // 次の行はエラーになります (constは変更できない):
    // s[0] = 'x';

    import std.stdio : writeln;
    writeln(s);
}

// `const`のおかげで、どちらの呼び出しもコンパイルされます:
foo("abcd"); // stringは変更不可能な配列
foo("abcd".dup); // .dupは変更可能なコピーを返す

immutableconstどちらも推移的な型修飾子です。つまり、一度constが型に適用されると、 その型のすべてのサブコンポーネントにも再帰的にそれが適用されます。

掘り下げる

ベーシック・リファレンス

アドバンスト・リファレンス

rdmd playground.d