D 编程 - 不可变


我们经常使用可变变量,但很多情况下不需要可变性。在这种情况下可以使用不可变变量。下面给出了一些可以使用不可变变量的示例。

  • 如果数学常量(例如pi)永远不会改变。

  • 对于我们想要保留值的数组,这不是突变的要求。

不变性使得可以了解变量是不可变的还是可变的,从而保证某些操作不会更改某些变量。它还降低了某些类型的程序错误的风险。D 的不变性概念由 const 和 immutable 关键字表示。尽管这两个词本身的含义很接近,但它们在程序中的职责不同,有时甚至是不相容的。

D 的不变性概念由 const 和 immutable 关键字表示。尽管这两个词本身的含义很接近,但它们在程序中的职责不同,有时甚至是不相容的。

D 中不可变变量的类型

存在三种类型的永远不能改变的定义变量。

  • 枚举常量
  • 不可变变量
  • 常量变量

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 变量不能像 immutable 一样被修改。不可变变量可以作为不可变参数传递给函数,因此建议使用 immutable 而不是 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 会删除有关原始变量是可变还是不可变的信息,因此使用 immutable 会使其在保留原始类型的情况下传递给其他函数。下面显示了一个简单的示例。

例子

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