D 编程 - Mixin



Mixin 是允许将生成的代码混合到源代码中的结构体。Mixin 可以是以下类型:

  • 字符串 Mixin
  • 模板 Mixin
  • Mixin 命名空间

字符串 Mixin

D 具有在编译时插入字符串代码的能力,只要该字符串在编译时已知。字符串 Mixin 的语法如下所示:

mixin (compile_time_generated_string)

示例

下面显示了一个字符串 Mixin 的简单示例。

import std.stdio; 
 
void main() { 
   mixin(`writeln("Hello World!");`); 
}

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

Hello World!

这是另一个示例,我们可以在编译时传递字符串,以便 Mixin 可以使用函数重用代码。如下所示。

import std.stdio;

string print(string s) {
   return `writeln("` ~ s ~ `");`; 
}
  
void main() { 
   mixin (print("str1")); 
   mixin (print("str2")); 
}

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

str1
str2

模板 Mixin

D 模板定义了通用的代码模式,编译器可以根据该模式生成实际的实例。模板可以生成函数、结构体、联合体、类、接口以及任何其他合法的 D 代码。模板 Mixin 的语法如下所示。

mixin a_template!(template_parameters)

下面显示了一个字符串 Mixin 的简单示例,我们使用类 Department 创建一个模板,并使用一个 Mixin 实例化该模板,从而使函数 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 

Mixin 命名空间

Mixin 命名空间用于避免模板 Mixin 中的歧义。例如,可能存在两个变量,一个在 main 中显式定义,另一个是混合的。当混合的名称与周围作用域中的名称相同时,将使用周围作用域中的名称。此示例如下所示。

示例

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
广告