Modulos
Tuesday, 11 December , 2007
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.

Wednesday, 12 December , 2007 at 2:45 am
[...] tiene la habilidad de llamar métodos de instancia definidos en el módulo (esto lo vimos en los ejemplos anteriores). Se podría decir que cuando hacemos un Mixin, por ejmeplo dentro de la clase A hacemos un include [...]