Dプログラミング-不変
可変の変数を使用することがよくありますが、可変性が必要ない場合も多くあります。このような場合、不変変数を使用できます。不変変数を使用できるいくつかの例を以下に示します。
円周率など、決して変化しない数学定数の場合。
値を保持したい配列の場合、それはミューテーションの要件ではありません。
不変性により、変数が不変であるか可変であるかを理解でき、特定の操作で特定の変数が変更されないことが保証されます。また、特定の種類のプログラムエラーのリスクを軽減します。Dの不変性の概念は、constおよび不変のキーワードで表されます。2つの単語自体の意味は近いですが、プログラムでの責任は異なり、互換性がない場合もあります。
Dの不変性の概念は、constおよび不変のキーワードで表されます。2つの単語自体の意味は近いですが、プログラムでの責任は異なり、互換性がない場合もあります。
Dの不変変数のタイプ
変更できない定義変数には3つのタイプがあります。
- 列挙型定数
- 不変変数
- const変数
Dの列挙型定数
列挙型定数を使用すると、定数値を意味のある名前に関連付けることができます。簡単な例を以下に示します。
例
import std.stdio;
enum Day{
Sunday = 1,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
void main() {
Day day;
day = Day.Sunday;
if (day == Day.Sunday) {
writeln("The day is Sunday");
}
}
上記のコードをコンパイルして実行すると、次の結果が得られます。
The day is Sunday
Dの不変変数
不変変数は、プログラムの実行中に決定できます。初期化後、不変になるようにコンパイラに指示するだけです。簡単な例を以下に示します。
例
import std.stdio;
import std.random;
void main() {
int min = 1;
int max = 10;
immutable number = uniform(min, max + 1);
// cannot modify immutable expression number
// number = 34;
typeof(number) value = 100;
writeln(typeof(number).stringof, number);
writeln(typeof(value).stringof, value);
}
上記のコードをコンパイルして実行すると、次の結果が得られます。
immutable(int)4
immutable(int)100
上記の例で、データ型を別の変数に転送し、印刷中にstringofを使用する方法を確認できます。
Dの定数変数
const変数は、不変のように変更することはできません。不変変数は不変パラメーターとして関数に渡すことができるため、constよりも不変を使用することをお勧めします。前に使用したのと同じ例が、以下に示すようにconst用に変更されています。
例
import std.stdio;
import std.random;
void main() {
int min = 1;
int max = 10;
const number = uniform(min, max + 1);
// cannot modify const expression number|
// number = 34;
typeof(number) value = 100;
writeln(typeof(number).stringof, number);
writeln(typeof(value).stringof, value);
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
const(int)7
const(int)100
Dの不変パラメータ
constは、元の変数が可変か不変かに関する情報を消去するため、不変を使用すると、元の型が保持された他の関数が渡されます。簡単な例を以下に示します。
例
import std.stdio;
void print(immutable int[] array) {
foreach (i, element; array) {
writefln("%s: %s", i, element);
}
}
void main() {
immutable int[] array = [ 1, 2 ];
print(array);
}
上記のコードをコンパイルして実行すると、次の結果が得られます。
0: 1
1: 2