Programmation D - Mixins

Les mixins sont des structures qui permettent de mélanger le code généré dans le code source. Les mixins peuvent être des types suivants -

  • Mixins à cordes
  • Mixins de modèles
  • Espaces de nom mixin

Mixins à cordes

D a la capacité d'insérer du code sous forme de chaîne tant que cette chaîne est connue au moment de la compilation. La syntaxe des mixins de chaînes est indiquée ci-dessous -

mixin (compile_time_generated_string)

Exemple

Un exemple simple de mixins à cordes est présenté ci-dessous.

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

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Hello World!

Voici un autre exemple où nous pouvons passer la chaîne au moment de la compilation afin que les mixins puissent utiliser les fonctions pour réutiliser le code. Il est montré ci-dessous.

import std.stdio;

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

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

str1
str2

Mixins de modèles

Les modèles D définissent des modèles de code communs, pour que le compilateur génère des instances réelles à partir de ce modèle. Les modèles peuvent générer des fonctions, des structures, des unions, des classes, des interfaces et tout autre code D légal. La syntaxe des mixins de modèles est indiquée ci-dessous.

mixin a_template!(template_parameters)

Un exemple simple de mixins de chaîne est montré ci-dessous où nous créons un modèle avec la classe Department et un mixin instanciant un modèle et rendant ainsi les fonctions setName et printNames disponibles au collège de structure.

Exemple

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

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

The names 
0 : name1 
1 : name2

Espaces de noms de mixin

Les espaces de nom de mixin sont utilisés pour éviter les ambiguïtés dans les mixins de modèles. Par exemple, il peut y avoir deux variables, l'une définie explicitement dans main et l'autre est mélangée. Lorsqu'un nom mélangé est identique à un nom qui est dans la portée environnante, alors le nom qui est dans la portée environnante obtient utilisé. Cet exemple est illustré ci-dessous.

Exemple

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

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

name 1 
name 2