Moduli

In ruby i moduli sono simili alle classi, eccetto che:

  • Un modulo non può avere istanze.
  • Un modulo non può avere sottoclassi.
  • Un modulo è definito dalle parole chiave module ... end.

In realtà... la classe Module dei moduli è lasuperclasse della classe Class delle classi. Avete capito?No? Lasciatemi andare avanti.

Ci sono due modi di utilizzare i moduli. Uno è quellodi raccogliere i metodi e le costanti correlate in un unicoposto. Il modulo Math della libreria standarddel ruby funziona così: plays such a

ruby> Math.sqrt(2)   1.41421ruby> Math::PI   3.14159

 

L'operatore :: dice all'interprete rubyquale modulo dovrebbe consultare per ottenere il valore diuna costante (concepibilmente, alcuni moduli oltre aMath potrebbere intendere qualche altra cosaperPI). Se vogliamo riferirci ai metodi e allecostanti di un modulo direttamente senza usare::, possiamo includere, coninclude, quel modulo:

ruby> include Math   Objectruby> sqrt(2)   1.41421ruby> PI   3.14159

Un altro utilizzo dei moduli è chiamatomixin. Alcuni linguaggi di programmazione OO,incluso il C++, permettono l'ereditarietàmultipla, che è, l'ereditarietà dapiù di una superclasse. Un esempio dal mondo-reale diereditarietà multipla è una sveglia; èpossibile pensare ad una sveglia come appartenente allaclasse degli orologi e anche alla classe dellecose che suonano.

Ruby intenzionalmente non implementa una veraereditarietà multipla, ma la caratteristicamixin è una buona alternativa. Ricordate chei moduli non possono essere istanziati o avere sottoclassi;ma se includiamo, con include, un modulo nelladefinizione di una classe, i suoi metodi saranno aggiunti, o"mixed in" (mescolati), a quelli della classe.

Il mixin può essere pensato come un modo per chiederequalsiasi particolare proprietà che vogliamo avere. Adesempio, se una classe ha un metodo eachfunzionante, mescolandola con il moduloEnumerable della libreria standard riceviamo imetodi sort e find senza fatica.

Questo utilizzo dei moduli ci da le funzionalità dibase dell'ereditarietà multipla ma ci permette dirappresentare le relazioni tra le classi con una semplicestruttura ad albero, semplificando in questo modonotevolmente l'implementazione del linguaggio (una sceltasimile fu fatta dai progettisti del Java).



Ti potrebbe interessare anche

commenta la notizia