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

module Identifier statement1 statement2 ........... end

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

#!/usr/bin/ruby #El módulo definido en el archivo trig.rb module Trig PI = 3.141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. end end

Podemos definir múltiples módulos con el mismo nombre de función pero diferentes funcionalidades:

Ejemplo

#!/usr/bin/ruby #El módulo definido en el archivo moral.rb module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... end end

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

require filename

Aquí, la extensión del archivo.rbno es necesaria.

Ejemplo

$LOAD_PATH << '.' require 'trig.rb' require 'moral' y = Trig.sin(Trig::PI/4) wrongdoing = Moral.sin(Moral::VERY_BAD)

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

include modulename

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.

module Week FIRST_DAY = "Sunday" def Week.weeks_in_month puts "You have four weeks in a month" end def Week.weeks_in_year puts "You have 52 weeks in a year" end end

Ahora, puede referenciar ese módulo en una clase, como se muestra a continuación:

Ejemplo

#!/usr/bin/ruby $LOAD_PATH << '.' require "support" class Decade include Week no_of_yrs=10 def no_of_months puts Week::FIRST_DAY number=10*12 puts number end end d1=Decade.new puts Week::FIRST_DAY Week.weeks_in_month Week.weeks_in_year d1.no_of_months

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

module A def a1 end def a2 end end module B def b1 end def b2 end end class Sample include A include B def s1 end end samp=Sample.new samp.a1 samp.a2 samp.b1 samp.b2 samp.s1
  • 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 。

otras extensiones.