Il mixin in Ruby

6 maggio 2008

Nella “guida Ruby” abbiamo già incontrato i moduli ed abbiamo visto un semplice esempio di mixin. In questo articolo approfondiamo l’utilizzo dei moduli e della parola chiave include, con ulteriori implementazioni dell’ereditarietà multipla. Vediamo anche come modificare il comportamento delle istanze, oltre che delle classi, grazie ad extend e come realizzare metodi singleton.

Ereditarietà multipla

Iniziamo subito con la funzione principale del mixin: quella di permettere l’ereditarietà multipla attraverso i moduli e il metodo include. Prendiamo ad esempio un modello del comportamento dei cani.

module Aggressive
  def snarl
    "Grrr."
  end
end

class Dog
  include Aggressive
  
  def bark
    "Bau, bau."
  end
end

I metodi d’istanza del modulo Aggressive saranno ereditati dagli oggetti della classe Dog come metodi d’istanza.

> Dog.included_modules
=> [Aggressive, Kernel]
> Dog.instance_methods
=> ["bark", "snarl", ...]
> rowdy = Dog.new
=> #<Dog:0xb7c63f4c>
> rowdy.bark
=> "Bau, bau."
> rowdy.snarl
=> "Grrr."

L’output di Dog.instance_methods è ridotto per questioni di spazio e chiarezza.

Internamente quando includiamo un modulo, Ruby crea, a partire dai suoi metodi, una classe che diviene l’immediato antenato della nostra classe. Ad esempio se abbiamo una classe Dog che ha come classe padre Animal

Dog <- Animal
dopo l’inclusione del modulo Aggressive avremo indicativamente una situazione del genere:
Dog <- Aggressive <- Animal

Senza l’inclusione del modulo

> Dog.ancestors
=> [Dog, Animal, Object, Kernel]

Dopo l’inclusione del modulo “Agressive”

> Dog.ancestors
=> [Dog, Aggressive, Animal, Object, Kernel]

Se vuoi aggiornamenti su Il mixin in Ruby inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Il mixin in Ruby

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento dei dati per attività di marketing