D语言混合类型 - D语言教程

混合类型的结构,使所生成的代码中混合类型的源代码。混合类型可以是以下类型。

  • String 混合类型

  • Template 混合类型

  • 混合命名空间

String 混合类型

D语言有字符串在编译时插入代码串的能力。字符串混合类型的语法如下所示。

mixin (compile_time_generated_string)

一个简单字符串混合类型的例子如下所示。

import std.stdio;

void main()
{
   mixin(`writeln("Hello World!");`);
}

当上面的代码被编译并执行,它会产生结果如下:

Hello World!

这里是另一个例子,我们可以通过在字符串中的编译时间,以便混合类型可以使用函数来重用代码。它如下所示。

import std.stdio;

string print(string s)
{
   return `writeln("` ~ s ~ `");`;
}

void main()
{
   mixin (print("str1"));
   mixin (print("str2"));
}

当上面的代码被编译并执行,它会产生结果如下:

str1
str2

模板混合类型

D语言模板定义通用的代码模式,让编译器来生成该模式的实际情况。模板可以生成功能,结构,联合,类,接口,以及任何其他合法D代码。模板混合类型的语法如下所示。

mixin a_template!(template_parameters)

一个简单的例子字符串混合类型如下所示,我们创建一个类系和一个混合类型实例化一个模板一个模板,从而使得该功能的setName和printNames可用的结构college。

import std.stdio;

template Department(T, size_t count)
{
   T[count] names;

   void setName(size_t index, T name)
   {
      names[index] = name;
   }

   void printNames()
   {
      writeln("The names");

      foreach (i, name; names) 
      {
         writeln(i," : ", name);
      }
   }
}

struct College
{
   mixin Department!(string, 2);
}

void main()
{
   auto college = College();

   college.setName(0, "name1");
   college.setName(1, "name2");

   college.printNames();
}

当上面的代码被编译并执行,它会产生结果如下:

The names
0 : name1
1 : name2

混入名称空间

混入的名称空间是用来避免在模板中混合类型含糊不清。例如,可以有两个变量,一个在主显式定义,而另一个是混合的。当混合在名称相同的名称是在周边范围内,则认为是在周围范围的名称得到使用。这个例子显示如下。

import std.stdio;

template Person()
{
   string name;
   void print()
   {
      writeln(name);
   }
}

void main()
{
   string name;

   mixin Person a;

   name = "name 1";
   writeln(name);

   a.name = "name 2";
   print();
}

当上面的代码被编译并执行,它会产生结果如下:

name 1
name 2