📜  D编程-不可变

📅  最后修改于: 2020-11-04 05:16:57             🧑  作者: Mango


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

  • 在数学常数如pi的情况下,它永远不会改变。

  • 如果是数组,我们要保留值,这不是突变的要求。

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

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

D中不可变变量的类型

定义变量有三种类型,它们是永远不会突变的。

  • 枚举常量
  • 不变变量
  • 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修改了先前使用的相同示例。

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