programmer@work

robe da informatici

Ruby Module include vs prepend

Oggi cerchiamo di capire un po' meglio la differenza tra i metodi Module#include e Module#prepend. Vediamo la differenza con un esempio mooolto semplice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Person
  def name
    # return name here
    puts 'Call method name in class Person'
  end
end

module Superhero
  def fly
    # fly here
    puts 'Call method fly in module Superhero'
  end

  def name
    # return name here
    puts 'Call method name in module Superhero'
  end
end

Person.include(Superhero)

Person.new.name

Cosa abbiamo fatto? Allora abbiamo la classe Person con un metodo name. Poi abbiamo il modulo Superhero con due metodi: fly e name. Notare a questo punto che sia la classe Person che il modulo Superhero hanno entrambi un metodo che si chiama name. Ora andiamo a mixare la classe Person con il modulo Superhero usando il metodo include. Se invochiamo il metodo name su un oggetto di tipo Person vedremo che viene chiamato il metodo definito dentro la classe Person e non quello definito nel modulo Superhero. Questo ci potrebbe anche andare bene, ma a volte vorremmo che quando facciamo questo tipo di operazione i metodi del modulo che mixiamo sovrascrivessero (override) i metodi della classe, come succede quando estendiamo una classe. Per ottenere questo usiamo il metodo prepend al posto di include disponibile dalla versione 2 di Ruby.

1
2
3
Person.prepend(Superhero)

Person.new.name

Adesso vediamo che viene invocato il metodo name definito nel modulo Superhero.