Verwendung von Modulen in crystal

Wenn Ihre Anwendung wächst, möchten Sie Ihren Code nicht mehr in eine große .cr-Datei, sondern in kleinere Dateien aufteilen.

Sie können require aus Ihrer Haupt-.cr-Datei verwenden, um Code aus anderen Dateien hinzuzufügen:

require "./tools/*"

Diese Anweisung fügt Code aus dem Verzeichnis tools hinzu, relativ zu Ihrer Haupt-.cr-Datei.

Dies hilft, Ihre Anwendung "physisch" zu trennen, aber es kann auch wünschenswert sein, sie logisch zu trennen - vielleicht kann ein Teil des Codes in anderen Projekten wiederverwendet werden, und vielleicht wollen Sie auch Namensraumkollisionen vermeiden.

Was ist eine Namensraumkollision?

Wenn ein Methoden- oder Klassenname oder ein Konstantenname zweimal in verschiedenen Quelldateien im globalen Namensraum verwendet wird, kommt es zu einer Kollision.

Woher soll der Compiler wissen, welche der beiden definierten Methoden/Klassen man eigentlich will?

Um Namespace-Kollisionen zu vermeiden, teilen Sie Ihren Code in Module auf.

zum Beispiel:

Modul Fehlersuche

   Klasse SampleClass

   Ende

   SAMPLE_CONSTANT = "irgendein Wert"

   macro samplemacro(einige_variable)

     #somit Makro-Code

   Ende

1TP3Ihr Code geht hier

Ende

Zugriff auf Code in Modulen

Jetzt können Sie auf den Code wie folgt zugreifen (nachdem Sie die Datei, in der das Modul definiert ist, angefordert haben):

sampleinstance = Debug::SampleClass.new()

p Debug::SAMPLE_CONSTANT

Debug.Beispielmakro

Beachten Sie, dass ein Makro mit einer "."-Syntax und nicht mit einer ":"-Syntax aufgerufen wird. Sie können es als eine Methode des Moduls betrachten.

Einschließlich Module

Wenn Sie jedoch die zusätzliche Notation als lästig empfinden, können Sie das Modul mit seinem Methodennamen wie folgt einbinden:

Debug einschließen

dann können Sie auf die Methoden, Klassen, Konstanten und Makros ohne zusätzliche Notation zugreifen - als ob der Code buchstäblich per Copy & Paste in Ihre andere Quelldatei eingefügt wurde:

sampleinstance = SampleClass.new()

p SAMPLE_CONSTANT

Muster-Makro