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