Módulos, clases y mixin

Las clases son objetos.

Los módulos son librerías. Estos proveen métodos que se pueden usar en diferentes clases.

ClassModule
instantiationpuede ser instanciadoNO puede ser instanciado
usagecrear objetosfacilidad para el mixin, te provee un namespace
superclassmoduleobject
methodsmétodos de clase y métodos de instanciamétodos de módulo y métodos de instancia
inheritancehereda el comportamiento y puede ser la base de la herenciaNO herencia
inclusionNO puede ser incluidopuede ser incluido en clases y módulos usando el comando include (incluye todos los métodos de instancia como métodos instancia en una clase/módulo)
extensionNO puede ser extendido con el comando extend (solo con herencia)puede extender la instancia usando el comando extend (extiende la instancia dada con métodos singleton del módulo (module))

Mixins

Si incluyes con el mixin un módulo en una clase, puedes hacer uso de todos los métodos del módulo en una instancia de la clase.

module Debug
  def whoAmI?
    "#{self.type.name} (\##{self.id}): #{self.to_s}"
  end
end

class Phonograph
  include Debug
  # ...
end

class EightTrack
  include Debug
  # ...
end

phono = Phonograph.new("West End Blues")
track = EightTrack.new("Surrealistic Pillow")

phono.whoAmI?  → "Phonograph (#537766170): West End Blues"
track.whoAmI?  → "EightTrack (#537765860): Surrealistic Pillow"

En caso de que el módulo esté en un fichero a parte tienes que usar el require en el inicio del fichero donde lo importas con la dirección hasta el fichero. Al incluir un módulo no estás haciendo una copia de los métodos instancia, estás copiando una referencia al métodos. De esta forma si modificas el módulo todas las clases que incluyen el módulo verán reflejadas el cambio, incluso en caliente.

Extendiendo objetos

Se pueden mezclar un objeto con un módulo usando extend

module Humor
  def tickle
    "hee, hee!"
  end
end

a = "Grouchy"
a.extend Humor
a.tickle → "hee, hee!"

Si extiendes en una clase los métodos pasan a ser métodos de clase.

module Humor
  def tickle
    "hee, hee!"
  end
end

class Grouchy
  extend  Humor
end

Grouchy.tickle → "hee, hee!"