Mixins(Mixins)

优质
小牛编辑
125浏览
2023-12-01

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

  • String Mixins
  • Template Mixins
  • Mixin名称空间

String Mixins

只要该字符串在编译时已知,D就能够将代码作为字符串插入。 string mixins的语法如下所示 -

mixin (compile_time_generated_string)

例子 (Example)

字符串mixins的一个简单示例如下所示。

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

模板混合

D模板定义公共代码模式,以便编译器从该模式生成实际实例。 模板可以生成函数,结构,联合,类,接口和任何其他合法的D代码。 模板mixins的语法如下所示。

mixin a_template!(template_parameters)

字符串mixins的一个简单示例如下所示,我们使用类Department创建一个模板,并使用mixin实例化模板,从而使函数setName和printNames可用于结构学院。

例子 (Example)

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名称空间用于避免模板混合中的歧义。 例如,可以有两个变量,一个在main中明确定义,另一个在混合中。当混合名称与周围作用域中的名称相同时,周围作用域中的名称得到用过的。 此示例如下所示。

例子 (Example)

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