47 votes

Méthodes en Ruby : objets ou pas ?

Inspiré par cette discussion Après quelques recherches sur Internet, je n'ai pas trouvé de réponse à une question assez simple concernant les méthodes en Ruby : les méthodes sont-elles des objets ou non ?

Il y a différentes opinions aquí y et j'aimerais vraiment entendre, disons, une explication approfondie.

Je suis au courant de Object#method qui prend un nom de méthode et renvoie une méthode Method mais, d'un autre côté, il y a une chose similaire que vous pouvez faire avec les blocs pour les transformer en Proc Les instances et les blocs ne sont pas des objets, alors en quoi les méthodes sont-elles différentes ?

0 votes

Les fonctions sont des citoyens de première classe en Ruby et peuvent être converties en objets, alors pourquoi s'inquiéter ? Je pense que la réponse sera de trop bas niveau pour avoir beaucoup de sens...

3 votes

Le sont-ils ? À mon avis, le fait que vous deviez les convertir en objets fait qu'ils ne sont pas de première classe. C'est aussi ce que je voudrais apprendre des réponses.

0voto

Andrew Points 14110

Comme les parenthèses sont facultatives en ruby, les objets de méthode sont généralement "cachés" dans le sens où vous devez explicitement aller chercher l'objet de méthode via la fonction method méthode. Cependant, si vous faites l'effort de capturer un objet méthode, il devient tout à fait clair qu'il se comporte comme un objet. Depuis Ruby >= 2.1, il est plus facile que jamais d'en tirer parti.

Par exemple, vous pouvez faire en sorte que vos méthodes se comportent plus comme en Javascript (où l'objet de la méthode n'a pas de parens et où les parens sont utilisés pour appeler la méthode) comme suit :

foo = method def foo
  def a(num)
    3 * num.to_i
  end

  n = yield if block_given?
  a(n || 3)
rescue
  "oops!"
end

def foo.bar(num)
  a(num)
end

foo.class #=> Method
foo() #=> 9
foo.call #=> 9
foo.call{2} #=> 6
foo(){2} #=> 6
foo.call{ raise "blam!" } #=> "oops!"
foo.bar(5) #=> 15

Voir ce texte pour une version avec ces exemples écrits comme des tests.

Réponse de JRL cite le livre de Matz disant que les méthodes ne sont pas des objets comme les cordes, etc. sont, mais les objets méthodes sont réels, et à part le truc des parens/non parens, ils agissent à peu près comme n'importe quel autre objet ruby. C'est un le langage des canards Je considère donc que les méthodes sont des objets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X