Skip to content
This repository has been archived by the owner on Apr 4, 2023. It is now read-only.

Latest commit

 

History

History
95 lines (67 loc) · 2.21 KB

File metadata and controls

95 lines (67 loc) · 2.21 KB

Módulos

Los módulos en Ruby cumplen una doble función: evitan colisiones de nombres y nos ayudan a reutilizar código.

Un módulo es un contenedor de clases, métodos y constantes. Los módulos se definen utilizando la palabra clave module.

Creemos un módulo MyModule:

module MyModule
end

Dentro del módulo podemos definir clases, métodos y constantes. Por ejemplo:

module MyModule
  MAX_CONNECTIONS = 5

  def method_one
  end

  def method_two
  end

  class ThingOne
  end

  class ThingTwo
  end
end

Para acceder a las clases y constantes escribes el nombre del módulo, seguido de :: (doble dos puntos), seguido del nombre de la clase o la constante. Por ejemplo:

puts MyModule::MAX_CONNECTIONS # Imprime 5

MyModule::ThingOne.new # Crea una instancia de la clase

A los métodos que están definidos en un módulo no los podemos acceder directamente, tenemos que mezclar el módulo dentro de una clase.

Mezclando el módulo

Los módulos se pueden incluir dentro de una clase utilizando la palabra clave include:

class Person
  include MyModule
end

Esto va a incluir todos los métodos de MyModule dentro de Person, así que podemos llamar los métodos method_one y method_two (que definimos dentro del módulo MyModule en la sección anterior) sobre instancias de Person.

Otra ventaja de incluir (o mezclar) un módulo dentro de una clase es que podemos acceder a las clases y las constantes que están definidas dentro del módulo directamente:

class Person
  include MyModule

  def initialize
    puts MAX_CONNECTIONS # no hay necesidad de agregar el prefijo MyModule::
    ThingOne.new # no hay necesidad de agregar el prefijo MyModule::
  end
end

Es posible mezclar más de un módulo en una clase. Por ejemplo, suponiendo que existen los módulos Module1 y Module2, podemos hacer lo siguiente:

class Person
  include Module1
  include Module2
end

Anidando módulos

Es posible anidar módulos dentro de módulos. Por ejemplo:

module System
  module Currency
    class Dollar
    end
  end
end

¿Cómo accedemos a la clase Dollar? De la siguiente forma:

System::Currency::Dollar.new