Modulos

by Gastón Ramos

Bueno en este post voy a mostrar un ejemplo sencillo con módulos de ruby, muy básicamente un módulo es una colección de métodos y constanstes, los métodos en un módulo pueden ser métodos de instancia o métodos de módulo. Los métodos de instancia aparecen como métodos en una clase cuando el módulo es incluido, los métodos de módulo no. Al contrario los métodos de módulo pueden ser llamados sin crear un objeto encapsulado, mientras que los métodos de instanacia no. (ref: http://www.ruby-doc.org/core/classes/Module.html)

Veamos un ejemplo dónde tenemos algunos métodos de instancia:

module Saludo
  attr_accessor :saludo

  def agregar_nombre
    @saludo << " Pepe"
  end
end

class SaludoNuevo
  include Saludo

  def saludo= value
    @saludo = value
  end
end

s =  SaludoNuevo.new
s.saludo = 'Hola'
puts s.saludo
s.agregar_nombre
puts s.saludo

La salida de este programa es la siguiente:

=> Hola
=> Hola Pepe

Cómo podemos ver los métodos declarados dentro del Módulo Saludo aparecen cómo métodos de instancia de la clase SaludoNuevo, dado que Saludable “Mixed in” en SaludadorNuevo. Los Mixins son la manera en que ruby resuelve la Herencia Múltiple (Ya veremos algunos ejemplos más adelante).

Ahora agregamos un método de Módulo:

module Saludo
  attr_accessor :saludo

  def agregar_nombre
    @saludo << " Pepe"
  end

  def Saludo::general
    "Hola a todos"
  end
end

class SaludoNuevo
  include Saludo

  def saludo= value
    @saludo = value
  end
end

puts Saludo::general

s =  SaludoNuevo.new
s.saludo = 'Hola'
puts s.saludo
s.agregar_nombre
puts s.saludo

Y la salida es:

=> Hola a todos
=> Hola
=> Hola Pepe

Ahora vamos a agregar una variable de instancia en el módulo Y la vamos a usar y modificar desde la clase cliente:

module Saludo
  attr_accessor :saludo, :nombres

  def initialize
    @nombres = ["Pepe", "Gaston", "David"]
  end

  def agregar_nombre
    @saludo << " Pepe"
  end

  def Saludo::general
    "Hola a todos"
  end

end

class SaludoNuevo
  include Saludo

  def saludo= value
    @saludo = value
  end

  def saludo_general_con_nombres
    "Hola " + @nombres.join(', ')
  end

end

s = SaludoNuevo.new
puts s.saludo_general_con_nombres

# Modifico la variable de instancia @nombres Heredada del módulo "Saludo"
s.nombres << "Dave"
puts s.saludo_general_con_nombres

# Creo un nuevo objeto de Saludo Nuevo y modifico @nombres para
# ver que es una variable de instancia
s2 = SaludoNuevo.new
s2.nombres = ["Matz", "Kent", "Bruce"]
puts s2.saludo_general_con_nombres

puts s.saludo_general_con_nombres

la salida es:

=> Hola Pepe, Gaston, David
=> Hola Pepe, Gaston, David, Dave
=> Hola Matz, Kent, Bruce
=> Hola Pepe, Gaston, David, Dave

Bueno esto fue todo por ahora, cortito y sencilllo.