On ne peut pas vraiment dire.
La seule façon d'obtenir l'accès à une méthode est d'envoyer la commande #method
à un objet, qui renverra ensuite un message Method
objet. Mais est-ce que Method
l'objet de la méthode elle-même ? Ou bien s'agit-il d'une enveloppe autour de la méthode ? Ou encore, s'agit-il d'une version convertie de la méthode originale ?
Vous ne pouvez pas savoir : si vous voulez consulter une méthode, vous devez appeler #method
et à ce moment-là, vous avez définitivement sera obtenir un objet. Ce que c'était antes de vous avez appelé #method
vous ne pouvez pas regarder, donc vous ne pouvez pas dire.
Quelques points de repère : en Ruby, tout renvoie une valeur. Ce que fait def
retour ? C'est toujours renvoie à nil
et non un Method
objet. Et define_method
? Il renvoie un Proc
mais pas un Method
(ni un UnboundMethod
). [Note : dans Rubinius, def
retourne le bytecode compilé de la méthode, mais toujours pas un Method
objet.]
Si vous regardez les 4e et 5e paragraphes de la section 6.1 de la spécification du langage Ruby (lignes 29-34 et 1-5 des pages 5 et 6), vous pouvez clairement voir qu'une distinction est faite entre les méthodes et les objets. Et si vous regardez la spécification des classes intégrées, vous constaterez que ni l'une ni l'autre Method
ni UnboundMethod
sont là, ni Object#method
. C'est-à-dire que vous pouvez construire un interpréteur Ruby parfaitement conforme aux normes dans lequel les méthodes ne sont pas objets.
Maintenant, les blocs OTOH définitivement ne sont pas objets. Il existe de nombreuses façons de construire Proc
à partir de blocs, qui ont alors le même comportement que le bloc d'origine ( lambda
, proc
, Proc.new
le &
sigil), mais les blocs eux-mêmes ne sont pas des objets.
Pensez-y de cette façon : vous pouvez passer une chaîne de caractères à File.new
pour construire un objet fichier, mais cela ne fait pas d'une chaîne un fichier. Vous pouvez passer un bloc à Proc.new
pour construire un objet proc, mais cela ne fait pas d'un bloc un proc.
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.