无涯教程-D语言 - 混合(Mixins)

83 阅读2分钟

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

  • String Mixins
  • Template Mixins
  • Mixin name spaces

字符串混合

只要在编译时就知道该字符串,D就可以将代码作为字符串插入,字符串混合的语法如下所示-

mixin (compile_time_generated_string)

字符串混合的简单如下所示。

import std.stdio; 

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

编译并执行上述代码后,将产生以下输出-

Hello Learnfk!

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

import std.stdio;

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

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

编译并执行上述代码后,将产生以下输出-

str1
str2

模板混合

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

mixin a_template!(template_parameters)

下面显示了一个字符串mixin的简单示例,其中我们使用Department类创建一个模板,并化一个template的mixin,从而使结构学院可以使用setName和printNames函数。

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");

  </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">;</span><span class="pln"> names</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
     writeln</span><span class="pun">(</span><span class="pln">i</span><span class="pun">,</span><span class="str">" : "</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">);</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln">

} }

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 

混合名称空间

混入名称空间用于避免模板混入中的歧义,如,可以有两个变量,一个在main中显式定义,另一个在mixin中,当混合名称与周围范围中的名称相同时,周围范围中的名称将得到用过的。该如下所示。

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

参考链接

www.learnfk.com/d-programmi…