Sobes.tech
Junior

¿Para qué se utilizan los módulos en Ruby?

sobes.tech AI

Respuesta de la IA

Los módulos en Ruby se utilizan para dos propósitos principales:

  1. Namespaces (Espacios de nombres): Organización del código para evitar conflictos de nombres. Permiten agrupar clases, métodos y constantes relacionados bajo un mismo nombre. Esto ayuda a evitar situaciones en las que dos clases o métodos diferentes tengan el mismo nombre.

    # module_for_namespace.rb
    module MiFramework
      class Validador
        def validar(datos)
          # lógica de validación
        end
      end
    end
    
    # otro_archivo.rb
    # Para usar Validador de MiFramework:
    validador = MiFramework::Validador.new
    validador.validar("algunos datos")
    
  2. Mixins (Mezclas): Mecanismo para compartir funcionalidad (métodos) entre varias clases sin usar herencia clásica. Los módulos se incluyen en clases mediante include o prepend.

    • include: Los métodos del módulo están disponibles en las instancias de la clase y pueden ser sobrescritos en la misma clase. La búsqueda de métodos sigue el orden: clase actual, módulo incluido, superclases.
    • prepend: Inserta el módulo en la cadena de herencia antes de la clase. Los métodos del módulo tienen prioridad sobre los métodos de la clase.

    Ejemplo de uso de include:

    # mixin_module.rb
    module Loggable
      def log(mensaje)
        puts "[LOG] #{mensaje}"
      end
    end
    
    # class_using_mixin.rb
    class MiClase
      include Loggable # Incluimos el módulo Loggable
    
      def procesar_datos
        log("Procesando datos...") # Usamos método del módulo
        # resto de la lógica
      end
    end
    
    obj = MiClase.new
    obj.procesar_datos
    

    Ejemplo de uso de prepend:

    # mixin_module.rb
    module MiModuloPrependido
      def saludar
        puts "¡Hola desde el módulo!"
      end
    end
    
    # class_with_prepend.rb
    class MiClasePrepend
      prepend MiModuloPrependido # El módulo precede a la clase en la cadena de herencia
    
      def saludar
        puts "¡Hola desde la clase!"
      end
    end
    
    obj = MiClasePrepend.new
    obj.saludar # Mostrará "¡Hola desde el módulo!" porque el método del módulo tiene prioridad
    

Los módulos no pueden ser instanciados (no se puede crear un objeto de un módulo) y no tienen una cadena de herencia en el mismo sentido que las clases.