别名,正如它的名字是指为现有名称的替代名称。别名的语法如下所示。
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