D 语言 - alias 别名
别名,如名称所指,为现有名称提供备用名称。 别名的语法如下所示。
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
在上面的示例中,我们没有使用 to!string(a),而是将其指定为别名 toString,使其更方便、更容易理解。
元组的别名
让我们看另一个可以为元组设置别名的示例。
import std.stdio; import std.typetuple; alias TypeTuple!(int, long) TL; void method1(TL tl) { writeln(tl[0],"\t", tl[1] ); } void main() { method1(5, 6L); }
当上面的代码被编译并执行时,会产生以下结果 −
5 6
在上面的示例中,类型元组被分配给别名变量,它简化了方法定义和变量访问。 当我们尝试重用此类类型元组时,这种访问更加有用。
数据类型的别名
很多时候,我们可能会定义需要在应用程序中使用的通用数据类型。 当多个程序员编写一个应用程序时,可能会出现一个人使用 int,另一个人使用 double 等情况。 为了避免这种冲突,我们经常使用类型作为数据类型。 下面显示了一个简单的示例。
示例
import std.stdio; alias int myAppNumber; alias string myAppString; void main() { myAppNumber i = 10; myAppString s = "TestString"; writeln(i,s); }
当上面的代码被编译并执行时,会产生以下结果 −
10TestString
类变量的别名
经常有这样的需求,我们需要在子类中访问超类的成员变量,这可以通过别名来实现,也可以使用不同的名称。
如果您对类和继承的概念不熟悉,请在开始本节之前查看有关 类 和 继承 的教程。
示例
下面显示了一个简单的示例。
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); }
当上面的代码被编译并执行时,会产生以下结果 −
Square 42
别名 this
别名提供了用户定义类型的自动类型转换的功能。 语法如下所示,其中关键字alias和this写在成员变量或成员函数的两侧。
alias member_variable_or_member_function this;
示例
下面的示例展示了别名 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)); }
在上面的示例中,您可以看到通过别名此方法将结构体矩形转换为双精度值。
当上面的代码被编译并执行时,会产生以下结果 −
30