Миксины — это структуры, которые позволяют смешивать сгенерированный код с исходным кодом. Mixins могут быть следующих типов —
- Струнные миксины
- Шаблон Mixins
- Смешанные пространства имен
Струнные миксины
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
Шаблон Mixins
Шаблоны D определяют общие шаблоны кода, чтобы компилятор генерировал реальные экземпляры из этого шаблона. Шаблоны могут генерировать функции, структуры, объединения, классы, интерфейсы и любой другой допустимый D-код. Синтаксис шаблонных миксов приведен ниже.
mixin a_template!(template_parameters)
Простой пример для строковых миксинов показан ниже, где мы создаем шаблон с классом Department и миксином, создаем экземпляр шаблона и, следовательно, делаем функции 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"); 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, а другая смешана. Когда смешанное имя совпадает с именем, которое находится в окружающей области видимости, тогда имя, которое находится в окружающей области видимости, получает используемый. Этот пример показан ниже.
пример
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(); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —