D编程 不可变
我们经常使用可变的变量,但是在很多情况下不需要可变性。
D的不变性概念由const和immutable关键字表示,尽管这两个词本身的含义很接近,但它们在程序中的职责有所不同,有时是不兼容的。
枚举常量
枚举常量使将常量值与有意义的名称相关联成为可能,一个简单的如下所示。
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
不变变量
不变变量可以在程序执行期间确定,它只是指示编译器在初始化之后变得不可变。一个简单的如下所示。
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。
常量变量
常量变量不能像不可变一样进行修改,不变变量可以作为不变参数传递给函数,因此建议在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
不可变参数
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