D語言常數


我們經常使用的是可變的變數,但可以有很多場合是不需要可變。不可變的變數可以在這樣的情況下被使用。幾個例子下面給出其中不可改變的變數都可以使用。

  • 像圓周率是永遠不變的數學常數。

  • 陣列,其中我們希望保留的值,這是不突變的要求。

不變性使得它可以用於理解變數是不可變的或可變的低保某些操作不改變某些變數。它也減少某些型別的程式的錯誤的風險。 D語言的不變性概念是由const和不可改變的關鍵字來表示。雖然這兩個詞本身詞義相近,它們在程式的責任是不同的,有時卻是不相容的。

不可變的變數的型別

有三種型別的限定,可以從未被可變的變數。

  • 列舉常數

  • 不可變的變數

  • const的變數

列舉常數

列舉常數使我們能夠與常數值為有意義的名稱。一個簡單的例子如下所示。

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 變數

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

不可改變的引數

常數刪除對原變數是否是可變的或者不可變的,因此使用不可變使得它通過它的其他函式保留了原始型別的資訊。一個簡單的例子如下所示。

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