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