Sobes.tech
Junior

Para que são utilizados os módulos em Ruby?

sobes.tech IA

Resposta da IA

Os módulos em Ruby são usados para dois propósitos principais:

  1. Namespaces (Espaços de nomes): Organização do código para evitar conflitos de nomes. Permitem agrupar classes, métodos e constantes relacionados sob um mesmo nome. Isso ajuda a evitar situações em que duas classes ou métodos diferentes tenham o mesmo nome.

    # module_for_namespace.rb
    module MinhaFramework
      class Validador
        def validar(dados)
          # lógica de validação
        end
      end
    end
    
    # outro_ficheiro.rb
    # Para usar Validador de MinhaFramework:
    validador = MinhaFramework::Validador.new
    validador.validar("alguns dados")
    
  2. Mixins (Misturas): Mecanismo para compartilhar funcionalidades (métodos) entre várias classes sem usar herança clássica. Os módulos são incluídos nas classes usando include ou prepend.

    • include: Os métodos do módulo estão disponíveis nas instâncias da classe e podem ser sobrescritos na própria classe. A busca por métodos segue a ordem: classe atual, módulo incluído, superclasses.
    • prepend: Insere o módulo na cadeia de herança antes da classe. Os métodos do módulo têm prioridade sobre os métodos da classe.

    Exemplo de uso de include:

    # mixin_module.rb
    module Loggable
      def log(mensagem)
        puts "[LOG] #{mensagem}"
      end
    end
    
    # class_using_mixin.rb
    class MinhaClasse
      include Loggable # Inclui o módulo Loggable
    
      def processar_dados
        log("Processando dados...") # Usa método do módulo
        # resto da lógica
      end
    end
    
    obj = MinhaClasse.new
    obj.processar_dados
    

    Exemplo de uso de prepend:

    # mixin_module.rb
    module MeuModuloPrependido
      def cumprimentar
        puts "Olá do módulo!"
      end
    end
    
    # class_with_prepend.rb
    class MinhaClassePrepend
      prepend MeuModuloPrependido # O módulo precede a classe na cadeia de herança
    
      def cumprimentar
        puts "Olá da classe!"
      end
    end
    
    obj = MinhaClassePrepend.new
    obj.cumprimentar # Mostrará "Olá do módulo!" porque o método do módulo tem prioridade
    

Os módulos não podem ser instanciados (não é possível criar um objeto de um módulo) e não possuem uma cadeia de herança no mesmo sentido que as classes.