我們經(jīng)常使用的是可變的變量,但可以有很多場(chǎng)合是不需要可變。不可變的變量可以在這樣的情況下被使用。幾個(gè)例子下面給出其中不可改變的變量都可以使用。
像圓周率是永遠(yuǎn)不變的數(shù)學(xué)常數(shù)。
陣列,其中我們希望保留的值,這是不突變的要求。
不變性使得它可以用于理解變量是不可變的或可變的低保某些操作不改變某些變量。它也減少某些類型的程序的錯(cuò)誤的風(fēng)險(xiǎn)。 D語言的不變性概念是由const和不可改變的關(guān)鍵字來表示。雖然這兩個(gè)詞本身詞義相近,它們?cè)诔绦虻呢?zé)任是不同的,有時(shí)卻是不兼容的。
有三種類型的限定,可以從未被可變的變量。
枚舉常量
不可變的變量
const的變量
枚舉常量使我們能夠與常數(shù)值為有意義的名稱。一個(gè)簡(jiǎn)單的例子如下所示。
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"); } }
如果我們編譯并運(yùn)行上面的代碼,這會(huì)產(chǎn)生以下結(jié)果:
The day is Sunday
不可變的變量可以在程序的執(zhí)行過程中確定。它只是指示的初始化后,它成為不可改變的編譯器。一個(gè)簡(jiǎn)單的例子如下所示。
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); }
如果我們編譯并運(yùn)行上面的代碼,這會(huì)產(chǎn)生以下結(jié)果:
immutable(int)4 immutable(int)100
可以在上面的例子中看到它是如何可能的數(shù)據(jù)類型傳送到另一個(gè)變量,并使用stringof同時(shí)打印。
const變量不能被修改類似不可改變的。不可變的變量可以傳遞給函數(shù)作為他們不變的參數(shù),因此建議使用一成不變超過常量。前面使用的相同的例子被修改為常量,如下所示。
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); }
如果我們編譯并運(yùn)行上面的代碼,這會(huì)產(chǎn)生以下結(jié)果:
const(int)7 const(int)100
常量刪除對(duì)原變量是否是可變的或者不可變的,因此使用不可變使得它通過它的其他函數(shù)保留了原始類型的信息。一個(gè)簡(jiǎn)單的例子如下所示。
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); }
如果我們編譯并運(yùn)行上面的代碼,這會(huì)產(chǎn)生以下結(jié)果:
0: 1 1: 2