别名(Aliases)
别名,如名称所指,为现有名称提供备用名称。 别名的语法如下所示。
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,另一个人使用int等情况。 为避免此类冲突,我们经常使用数据类型的类型。 一个简单的例子如下所示。
例子 (Example)
import std.stdio;
alias int myAppNumber;
alias string myAppString;
void main() {
myAppNumber i = 10;
myAppString s = "TestString";
writeln(i,s);
}
编译并执行上述代码时,会产生以下结果 -
10TestString
类变量的别名
通常需要我们需要访问子类中超类的成员变量,这可以通过别名实现,可能使用不同的名称。
如果您不熟悉classes和inheritance的概念,请在开始本节之前查看有关classes和inheritance的教程。
例子 (Example)
一个简单的例子如下所示。
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
别名这个
别名这提供了用户定义类型的自动类型转换功能。 语法如下所示,其中关键字别名和它写在成员变量或成员函数的任一侧。
alias member_variable_or_member_function this;
例子 (Example)
下面显示了一个示例,以显示别名的功效。
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));
}
在上面的示例中,您可以看到结构矩形在alias this方法的帮助下转换为double值。
编译并执行上述代码时,会产生以下结果 -
30