A cosa servono i moduli in Ruby?
sobes.tech AI
Risposta dell'AI
I moduli in Ruby vengono utilizzati per due scopi principali:
-
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") -
Mixins (Incorporamenti): Meccanismo per condividere funzionalità (metodi) tra più classi senza usare ereditarietà classica. I moduli vengono inclusi nelle classi tramite
includeoprepend.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_datiEsempio 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.