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.

La méthode super en Ruby - partie 2

| Comments

Niveau : facile

Comme me le faisait remarquer ce matin un lecteur, il manque un cas à mon article d’hier sur l’utilisation de super en Ruby. C’est d’autant plus impardonnable que c’est un cas où, pour une fois, les parenthèses sont obligatoires à la fin d’une méthode.

Voici donc une classe de base et une classe fille:

1
2
3
4
5
6
7
8
9
10
11
12
class Base
  def foo
    puts "Base#foo"
  end
end

class Child < Base
  def foo(bar)
    super
    puts "Child#foo with #{bar}"
  end
end

Et maintenant on essaye le tout:

1
2
3
child = Child.new
child.foo
#=> ArgumentError: wrong number of arguments (0 for 1)

Boum ! Comme on l’a vu hier, super passe automatiquement tous les paramètres de la méthode dans laquelle il est appelé vers la classe de base. Et là, notre méthode foo dans la classe de base est sans argument.

Pour résoudre ce problème, on est obligé de mettre des parenthèses à la suite de super:

1
2
3
4
5
6
class Child < Base
  def foo(bar)
    super()
    puts "Child#foo with #{bar}"
  end
end
1
2
3
4
child = Child.new
child.foo('ok')
Base#foo
Child#foo with ok

Voilà, oubli réparé.

À demain.

Articles connexes

Commentaires