Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Ruby - extend self

| Comments

Niveau : facile

Vous débutez en Ruby et vous vous demandez ce que peut bien signifier ce extend self qu’on rencontre parfois dans un module utilitaire ?

Voici un exemple:

1
2
3
4
5
6
7
8
9
10
module M
  extend self

  def foo
    puts 'foo'
  end
end

M.foo
#=> foo

La ligne extend self nous permet de définir toutes les méthodes du module comme étant des méthodes de classe. C’est pas plus compliqué que ça.

On aurait pu écrire à la place:

1
2
3
4
5
module M
  def self.foo
    puts 'foo'
  end
end

Ou bien encore:

1
2
3
4
5
6
7
module M
  class << self
    def foo
      puts 'foo'
    end
  end
end

Il y a quand même une subtilité qui fait toute la différence ! Sinon ça ne serait pas drôle. En utilisant la syntaxe extend self, toutes les méthodes sont des méthodes de classe, ou de module si vous préférez ;) La différence est importante puisqu’ainsi on ne pourra pas mélanger méthodes utilitaires et méthodes à inclure dans une classe. Ce qui est parfois tentant, mais c’est mal. Mais tentant. Mais mal…

À demain.

Articles connexes

Commentaires