发布于 2015-08-16 14:49:19 | 205 次阅读 | 评论: 0 | 来源: 网络整理
别名,正如它的名字是指为现有名称的替代名称。别名的语法如下所示。
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],"t", 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