Sobes.tech
Junior

A cosa servono i moduli in Ruby?

sobes.tech AI

Risposta dell'AI

I moduli in Ruby vengono utilizzati per due scopi principali:

  1. Namespaces (Spazi dei nomi): Organizzazione del codice per evitare conflitti di nomi. Permettono di raggruppare classi, metodi e costanti correlate sotto un unico nome. Questo aiuta a evitare situazioni in cui due classi o metodi diversi abbiano lo stesso nome.

    # module_for_namespace.rb
    module MioFramework
      class Validatore
        def valida(dati)
          # logica di validazione
        end
      end
    end
    
    # altro_file.rb
    # Per usare Validatore da MioFramework:
    validatore = MioFramework::Validatore.new
    validatore.valida("alcuni dati")
    
  2. Mixins (Incorporamenti): Meccanismo per condividere funzionalità (metodi) tra più classi senza usare ereditarietà classica. I moduli vengono inclusi nelle classi tramite include o prepend.

    • include: I metodi del modulo sono disponibili nelle istanze della classe e possono essere sovrascritti nella stessa classe. La ricerca dei metodi segue l'ordine: classe corrente, modulo incluso, superclassi.
    • prepend: Inserisce il modulo prima della classe nella catena di ereditarietà. I metodi del modulo hanno priorità sui metodi della classe.

    Esempio di utilizzo di include:

    # mixin_module.rb
    module Loggable
      def log(messaggio)
        puts "[LOG] #{messaggio}"
      end
    end
    
    # class_using_mixin.rb
    class MiaClasse
      include Loggable # Includiamo il modulo Loggable
    
      def processa_dati
        log("Processo dati...") # Usiamo metodo dal modulo
        # altra logica
      end
    end
    
    obj = MiaClasse.new
    obj.processa_dati
    

    Esempio di utilizzo di prepend:

    # mixin_module.rb
    module MioModuloPrepend
      def saluta
        puts "Ciao dal modulo!"
      end
    end
    
    # class_with_prepend.rb
    class MiaClassePrepend
      prepend MioModuloPrepend # Il modulo precede la classe nella catena di ereditarietà
    
      def saluta
        puts "Ciao dalla classe!"
      end
    end
    
    obj = MiaClassePrepend.new
    obj.saluta # Mostrerà "Ciao dal modulo!" perché il metodo del modulo ha priorità
    

I moduli non possono essere istanziati (non si può creare un oggetto di un modulo) e non hanno una catena di ereditarietà nello stesso senso delle classi.