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