Ruby Módulo (Module)
Un módulo (Module) es una forma de agrupar métodos, clases y constantes. El módulo (Module) le ofrece dos grandes beneficios.
- El módulo proporciona unespacio de nombresy evita conflictos de nombres.
- El módulo implementamixinun dispositivo.
Un módulo (Module) define un espacio de nombres, equivalente a una caja de arena (sandbox), en la que sus métodos y constantes no entrarán en conflicto con los métodos y constantes de otros lugares.
Los módulos son similares a las clases, pero tienen las siguientes diferencias:
- Un módulo no puede ser instanciado.
- Un módulo no tiene subclases.
- Un módulo solo puede ser definido por otro módulo.
Sintaxis
Las constantes de módulo se nombran de manera similar a las constantes de clase, comenzando con una letra mayúscula. La definición de métodos también parece similar: la definición de métodos de módulo es similar a la definición de métodos de clase.
Al igual que los métodos de clase, puede colocar el nombre del módulo y un punto delante del nombre del método para invocar métodos del módulo, y puede usar el nombre del módulo y dos puntos dobles para referenciar una constante.
Ejemplo
Podemos definir múltiples módulos con el mismo nombre de función pero diferentes funcionalidades:
Ejemplo
Igual que con los métodos de clase, cuando define un método en un módulo, puede especificar que después del nombre del módulo siga un punto, y después del punto el nombre del método.
Ruby requireSentencia
La sentencia require es similar a la sentencia include en C y C++, y a la sentencia import en Java. Si un programa de terceros quiere usar cualquier módulo definido, puede simplemente usar la sentencia Rubyrequirepara cargar el archivo del módulo:
Sintaxis
Sintaxis
Aquí, la extensión del archivo.rbno es necesaria.
Ejemplo
Aquí, usamos$LOAD_PATH << '.'para que Ruby sepa que debe buscar los archivos referenciados en el directorio actual. Si no desea usar $LOAD_PATH, entonces puede usarrequire_relativepara referenciar archivos desde un directorio relativo.
Nota:Aquí, los archivos contienen los mismos nombres de función. Por lo tanto, esto provocará ambigüedad de código al hacer referencia al programa llamador, pero los módulos evitan esta ambigüedad, y podemos usar el nombre del módulo para invocar la función adecuada.
Ruby includeSentencia
Puede incrustar módulos en una clase. Para incrustar un módulo en una clase, puede usar en la claseincludela sentencia:
Sintaxis
Si el módulo está definido en un archivo separado, antes de incrustar el módulo es necesario usarrequirela sentencia para referenciar ese archivo.
Ejemplo
Supongamos que el siguiente módulo está escrito en elsupport.rbarchivo.
Ahora, puede referenciar ese módulo en una clase, como se muestra a continuación:
Ejemplo
Esto producirá el siguiente resultado:
Sunday You have four weeks in a month You have 52 weeks in a year Sunday 120
Mixins en Ruby
Antes de leer esta sección, necesita tener un conocimiento preliminar de los conceptos de orientación a objetos.
Cuando una clase puede heredar características de múltiples clases padre, se dice que presenta herencia múltiple.
Ruby no admite directamente la herencia múltiple, pero los módulos (Module) de Ruby tienen otra función mágica. Casi elimina la necesidad de la herencia múltiple, proporcionando un tipo demixindispositivo.
Ruby no implementa realmente el mecanismo de herencia múltiple, sino que adopta la técnica mixin como sustituto. Al incluir (include) un módulo en la definición de la clase, los métodos del módulo se mezclan (mix) en la clase.
Veamos el siguiente código de ejemplo para comprender mejor los mixins:
Ejemplo
- El módulo A está compuesto por los métodos a1 y a2.
- El módulo B está compuesto por los métodos b1 y b2.
- La clase Sample incluye los módulos A y B.
- La clase Sample puede acceder a los cuatro métodos, es decir, a1, a2, b1 y b2. Por lo tanto, puede ver que la clase Sample hereda de ambos módulos; se puede decir que la clase Sample utiliza herencia múltiple o mixin 。