Programação D - Mixins
Mixins são estruturas que permitem a mistura do código gerado no código-fonte. Mixins podem ser dos seguintes tipos -
- Mixins de corda
- Mixins de modelo
- Mixin de namespaces
Mixins de corda
D tem a capacidade de inserir código como string, desde que essa string seja conhecida no momento da compilação. A sintaxe dos mixins de string é mostrada abaixo -
mixin (compile_time_generated_string)
Exemplo
Um exemplo simples para mixins de cordas é mostrado abaixo.
import std.stdio;
void main() {
mixin(`writeln("Hello World!");`);
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Hello World!
Aqui está outro exemplo onde podemos passar a string em tempo de compilação para que os mixins possam usar as funções para reutilizar o código. É mostrado abaixo.
import std.stdio;
string print(string s) {
return `writeln("` ~ s ~ `");`;
}
void main() {
mixin (print("str1"));
mixin (print("str2"));
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
str1
str2
Mixins de modelo
Os modelos de D definem padrões de código comuns, para o compilador gerar instâncias reais desse padrão. Os modelos podem gerar funções, estruturas, uniões, classes, interfaces e qualquer outro código D legal. A sintaxe dos mixins de template é mostrada abaixo.
mixin a_template!(template_parameters)
Um exemplo simples para mixins de string é mostrado abaixo, onde criamos um template com a classe Department e um mixin instanciando um template e, portanto, tornando as funções setName e printNames disponíveis para a estrutura college.
Exemplo
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();
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
The names
0 : name1
1 : name2
Mixin Name Spaces
Os namespaces do Mixin são usados para evitar ambigüidades nos mixins de template. Por exemplo, pode haver duas variáveis, uma definida explicitamente em principal e a outra é misturada. Quando um nome misturado é o mesmo que um nome que está no escopo circundante, então o nome que está no escopo circundante obtém usava. Este exemplo é mostrado abaixo.
Exemplo
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();
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
name 1
name 2