Modules gebruiken in kristal

Naarmate uw applicatie groeit, zou u willen overstappen van één groot .cr-bestand naar het scheiden van uw code in kleinere bestanden.

Je kunt require van je hoofd .cr bestand gebruiken om code van andere bestanden toe te voegen:

require "./tools/*"

Dit statement zal code toevoegen uit de gereedschappen map, relatief aan je hoofd .cr bestand.

Dit zal helpen om je applicatie "fysisch" te scheiden, maar het kan ook wenselijk zijn om het logisch te scheiden - misschien kan een deel van de code hergebruikt worden in andere projecten, en misschien wil je ook namespace botsingen vermijden.

Wat is een namespace botsing?

Als een methode- of klassenaam, of een constante naam twee keer gebruikt wordt in verschillende bronbestanden in de globale naamruimte, zal je een botsing hebben.

Hoe moet de compiler weten, welke methode / klasse je eigenlijk wilt van de twee die gedefinieerd zijn?

Om namespace botsingen te vermijden, verdeel je je code in modules.

bijvoorbeeld:

module Debug

   klasse SampleClass

   einde

   SAMPLE_CONSTANT = "een of andere waarde"

   macrovoorbeeldmacro(een_variabele)

     #sommige macro code

   einde

1TP3Uw code komt hier

einde

Toegang tot code in modules

Nu kunt u de code openen (na het bestand te hebben vereist waarin de module is gedefinieerd) zoals dit:

monsterinstance = Debug::SampleClass.new()

p Debug::SAMPLE_CONSTANT

Debug.samplemacro

Merk op dat een macro wordt aangeroepen met een "." syntaxis, niet met een ":" syntaxis. Je kunt het beschouwen als een methode van de Module.

Inclusief modules

Als u de extra notatie daarentegen vermoeiend vindt, kunt u de module opnemen door de naam van de methode te gebruiken, zoals dit:

include Debug

dan zult u in staat zijn om de methodes, klassen, constanten en macro's te benaderen zonder enige extra notatie - alsof de code letterlijk gekopieerd en geplakt is in uw ander bronbestand:

monsterinstantie = SampleClass.new()

p SAMPLE_CONSTANT

monstermacro