Учебники

D Программирование — Mixins

Миксины — это структуры, которые позволяют смешивать сгенерированный код с исходным кодом. Mixins могут быть следующих типов —

  • Струнные миксины
  • Шаблон Mixins
  • Смешанные пространства имен

Струнные миксины

D имеет возможность вставлять код в виде строки, если эта строка известна во время компиляции. Синтаксис строковых миксинов показан ниже —

mixin (compile_time_generated_string)

пример

Простой пример для строковых миксинов показан ниже.

Live Demo

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

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Hello World!

Вот еще один пример, где мы можем передать строку во время компиляции, чтобы миксины могли использовать функции для повторного использования кода. Это показано ниже.

Live Demo

import std.stdio;

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

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

str1
str2

Шаблон Mixins

Шаблоны D определяют общие шаблоны кода, чтобы компилятор генерировал реальные экземпляры из этого шаблона. Шаблоны могут генерировать функции, структуры, объединения, классы, интерфейсы и любой другой допустимый D-код. Синтаксис шаблонных миксов приведен ниже.

mixin a_template!(template_parameters)

Простой пример для строковых миксинов показан ниже, где мы создаем шаблон с классом Department и миксином, создаем экземпляр шаблона и, следовательно, делаем функции setName и printNames доступными для структурного колледжа.

пример

Live Demo

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 

Смешанные пространства имен

Пространства имен миксинов используются, чтобы избежать неоднозначностей в миксинах шаблонов. Например, может быть две переменные, одна из которых определена явно в main, а другая смешана. Когда смешанное имя совпадает с именем, которое находится в окружающей области видимости, тогда имя, которое находится в окружающей области видимости, получает используемый. Этот пример показан ниже.

пример

Live Demo

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(); 
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —