不可变(Immutables)
优质
小牛编辑
127浏览
2023-12-01
我们经常使用可变的变量,但可能有很多情况下不需要可变性。 在这种情况下可以使用不可变的变量。 下面给出了一些可以使用不可变变量的例子。
在数学常量如pi情况下永远不会改变。
对于我们想要保留值的数组而言,它不是变异的要求。
不变性使得可以理解变量是不可变的还是可变的,从而保证某些操作不会改变某些变量。 它还降低了某些类型的程序错误的风险。 D的不变性概念由const和immutable关键字表示。 虽然这两个词本身的含义接近,但它们在程序中的责任是不同的,它们有时是不相容的。
D的不变性概念由const和immutable关键字表示。 虽然这两个词本身的含义接近,但它们在程序中的责任是不同的,它们有时是不相容的。
D中不可变变量的类型
有三种类型的定义变量永远不会发生变异。
- 枚举常量
- 不可变的变量
- const变量
enum D中的常数
枚举常量使得将常量值与有意义的名称相关联成为可能。 一个简单的例子如下所示。
例子 (Example)
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中的不可变变量
在程序执行期间可以确定不可变变量。 它只是指导编译器在初始化之后,它变得不可变。 一个简单的例子如下所示。
例子 (Example)
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。 前面使用的相同示例针对const进行了修改,如下所示。
例子 (Example)
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删除有关原始变量是可变还是不可变的信息,因此使用不可变使得它传递保留原始类型的其他函数。 一个简单的例子如下所示。
例子 (Example)
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