Uso de módulos en crystal
A medida que su aplicación crece, le gustaría pasar de un gran archivo .cr a separar su código en archivos más pequeños.
Puedes usar require de tu archivo principal .cr para añadir código de otros archivos:
require "./tools/*"
Esta declaración añadirá código del directorio de herramientas, relativo a su archivo principal .cr.
Esto ayudará a separar su aplicación "físicamente", pero también puede ser deseable separarla lógicamente - tal vez parte del código puede ser reutilizado en otros proyectos, y tal vez también quiera evitar colisiones de espacios de nombres.
¿Qué es una colisión de espacios de nombres?
Si un nombre de método o clase, o un nombre de constante se utiliza dos veces en diferentes archivos fuente en el espacio de nombres global, tendrá una colisión.
¿Cómo se supone que el compilador sabe qué método/clase quieres realmente de los dos que están definidos?
Para evitar colisiones de espacios de nombres, separa tu código en módulos.
por ejemplo:
módulo Debug
clase SampleClass
fin
SAMPLE_CONSTANT = "algún valor"
macro samplemacro(alguna_variable)
1TP3Algún código macro
fin
#u código va aquí
fin
Acceso al código en los módulos
Ahora puedes acceder al código (después de haber requerido el archivo en el que se define el módulo) así:
sampleinstance = Debug::SampleClass.new()
p Debug::SAMPLE_CONSTANT
Debug.samplemacro
Tenga en cuenta que una macro se llama con una sintaxis ".", no con una sintaxis ":". Puedes considerarla como un método del Módulo.
Incluidos los módulos
Si, por el contrario, la notación adicional te resulta pesada, puedes incluir el módulo utilizando su nombre de método de la siguiente manera:
incluye Debug
entonces podrá acceder a los métodos, clases, constantes y macros sin ninguna notación adicional - como si el código fuera literalmente copiado y pegado en su otro archivo fuente:
sampleinstance = SampleClass.new()
p SAMPLE_CONSTANT
muestramacro