別名,正如它的名字是指為現有名稱的替代名稱。別名的語法如下所示。
alias new_name = existing_name;以下是較舊的語法,以防萬一指定一些較舊的格式的例子。不推薦使用。
alias existing_name new_name;
還有用於與表達,它是下面給出中,我們可以直接使用,而不是表達的別名另一種語法。
alias expression alias_name ;
可能了解,typedef增加了建立新型別的能力。別名可以作為一個typedef類似的工作,甚至更多。一個簡單的例子,使用別名,如下圖所示,使用std.conv頭,它提供了型別轉換的能力。
import std.stdio; import std.conv:to; alias to!(string) toString; void main() { int a = 10; string s = "Test"~toString(a); writeln(s); }
當上面的程式碼被編譯並執行,它會產生什麼結果如下:
Test10
在上面的例子,而不是使用!string(a),我們已經分配給它的別名的toString使其更方便和更容易理解,我們。
讓我們來看看另一個例子,我們可以為一個元組設定別名。
import std.stdio; import std.typetuple; alias TypeTuple!(int, long) TL; void method1(TL tl) { writeln(tl[0]," ", tl[1] ); } void main() { method1(5, 6L); }
當上面的程式碼被編譯並執行,它會產生結果如下:
5 6
在上面的範例中,型別的元組被分配給變數的別名,它簡化了的方法的定義和變數的存取。當我們嘗試重用這種型別的元組的這種存取是更加有用。
很多時候,我們可以定義一個需要在整個應用程式中使用通用資料型別。當多個程式員編寫一個應用程式,它可以是情況下,一個人使用整型,另一雙等。為了避免這種衝突,我們經常使用型別的資料型別。一個簡單的例子如下所示。
import std.stdio; alias int myAppNumber; alias string myAppString; void main() { myAppNumber i = 10; myAppString s = "TestString"; writeln(i,s); }
當上面的程式碼被編譯並執行,它會產生什麼結果如下:
10TestString
如果不熟悉的類和繼承的概念,看看關於classesand繼承教學開始本節之前。往往有規定,我們需要存取的子類父類別的成員變數,這可以成為可能的別名,可能以不同的名稱。一個簡單的例子如下所示。
import std.stdio; class Shape { int area; } class Square : Shape { string name() const @property { return "Square"; } alias Shape.area squareArea; } void main() { auto square = new Square; square.squareArea = 42; writeln(square.name); writeln(square.squareArea); }
當上面的程式碼被編譯並執行,它會產生結果如下:
10TestString
這個別名提供了使用者自定義型別的自動型別轉換的能力。其語法如下所示,其中的關鍵字的別名,這都寫在成員變數或者成員函式的兩側。
alias member_variable_or_member_function this;
一個例子如下所示,顯示此別名的能力。
import std.stdio; struct Rectangle { long length; long breadth; double value() const @property { return cast(double) length * breadth; } alias value this; } double volume(double rectangle, double height) { return rectangle * height; } void main() { auto rectangle = Rectangle(2, 3); writeln(volume(rectangle, 5)); }
在上面的例子中,可以看到,結構矩形轉換為double值,在別名的幫助下這個方法。此程式碼被編譯並執行,它會產生結果如下:
30