Utilisation de modules en cristal

À mesure que votre application se développe, vous souhaitez passer d'un gros fichier .cr à la séparation de votre code en fichiers plus petits.

Vous pouvez utiliser les exigences de votre fichier principal .cr pour ajouter du code provenant d'autres fichiers :

exiger "./tools/*"

Cette instruction ajoutera le code du répertoire tools, par rapport à votre fichier .cr principal.

Cela vous aidera à séparer votre application "physiquement", mais il peut aussi être souhaitable de la séparer logiquement - peut-être qu'une partie du code peut être réutilisée dans d'autres projets, et peut-être que vous voulez aussi éviter les collisions d'espaces de noms.

Qu'est-ce qu'une collision d'espaces de noms ?

Si le nom d'une méthode, d'une classe ou d'une constante est utilisé deux fois dans des fichiers source différents dans l'espace de nom global, il y a collision.

Comment le compilateur est-il censé savoir quelle méthode/classe vous voulez réellement parmi les deux qui sont définies ?

Pour éviter les collisions d'espaces de noms, vous séparez votre code en modules.

par exemple :

module Debug

   classe SampleClass

   fin

   SAMPLE_CONSTANT = " une valeur quelconque ".

   macro samplemacro(une_variable)

     #some macro code

   fin

1TP3Votre code va ici

fin

Accès au code dans les modules

Maintenant vous pouvez accéder au code (après avoir requis le fichier dans lequel le module est défini) comme ceci :

sampleinstance = Debug::SampleClass.new()

p Debug::SAMPLE_CONSTANT

Debug.samplemacro

Notez qu'une macro est appelée avec la syntaxe ".", et non pas avec la syntaxe " :". Vous pouvez la considérer comme une méthode du module.

Y compris les modules

Si, par contre, vous trouvez cette notation supplémentaire fastidieuse, vous pouvez inclure le module en utilisant le nom de sa méthode comme ceci :

inclure Debug

vous pourrez alors accéder aux méthodes, classes, constantes et macros sans aucune notation supplémentaire - comme si le code était littéralement copié-collé dans votre autre fichier source :

sampleinstance = SampleClass.new()

p SAMPLE_CONSTANT

échantillonmacro