D 编程 - 别名



别名,顾名思义,为现有名称提供替代名称。别名的语法如下所示。

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

在上面的示例中,类型 tuple 被分配给别名变量,它简化了方法定义和变量访问。当我们尝试重用此类类型元组时,这种访问方式更加有用。

数据类型的别名

很多时候,我们可能会定义需要在整个应用程序中使用的通用数据类型。当多个程序员编写应用程序时,可能会出现一个人使用 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

别名 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)); 
}

在上面的示例中,您可以看到结构体 rectangle 在别名 this 方法的帮助下被转换为 double 值。

编译并执行上述代码后,将产生以下结果:

30
广告