66 votes

Pourquoi les méthodes dans la documentation Ruby sont-elles précédées d'un signe dièse ?

Lorsque je vois une méthode Ruby imprimée dans un texte, elle apparaît généralement sous la forme suivante :

Class#method

o

#method

Maintenant, j'utiliserais :

Class.method

Pourquoi toutes les méthodes Ruby sont-elles précédées d'un signe dièse ? Y a-t-il une raison à cela ?

0 votes

De quand date-t-il ?

3 votes

Il a été utilisé pour la première fois dans la première édition de Programming Ruby, publiée en 2001 : ruby-doc.com/docs/ProgrammingRuby/html/preface.html#S10 - le choix de la notation a été expliqué plus clairement dans la 2e édition parue en 2005.

111voto

Simon Nickerson Points 17147

Notez que la convention est :

Class#method

plutôt que

object#method

En code, vous auriez object.method si object était une instance de class . El # n'est pas utilisée dans le code.

De la documentation RDoc :

Utilisez : : pour décrire les méthodes de classe, # pour décrire les méthodes d'instance, et utilisez . pour le code d'exemple.

0 votes

Oui, désolé, Class#Method. Merci.

1 votes

Je sais que le # n'est pas utilisé dans le code, mais pourquoi est-il utilisé ?

31voto

dstnbrkr Points 2974

La notation # est utilisée pour se référer à l'image canonique instance comme String#upcase . La notation . est utilisée pour faire référence à la méthode d'une instance particulière, par exemple mystring.upcase . La distinction est faite pour ne pas laisser entendre qu'il existe une méthode de classe 'upcase'.

20voto

Jörg W Mittag Points 153275

Je viens de me rendre compte qu'aucune des autres réponses n'aborde l'aspect le plus trivial de la question : pourquoi la # signe ?

J'ai deux théories :

  1. Cela pourrait venir de Smalltalk, où les symboles sont écrits #sym (au lieu de :sym ) comme ils le sont en Ruby. Ainsi, si vous voulez se référer à à une méthode objet (par opposition à en appelant une méthode), alors vous appelleriez quelque chose comme Array >> #new. (Le >> est elle-même une méthode qui renvoie la méthode qui lui est passée. Donc, en Ruby, ce serait Array.method :new .) Dans la documentation Smalltalk, les méthodes sont généralement désignées sous le nom de Class>>method mais en Ruby Class:method aurait eu plus de sens, sauf qu'il est facilement confondu avec Class::method . Par conséquent, Class#method a été choisi.
  2. Mon autre théorie est qu'il a simplement été choisi parce que # est le caractère de commentaire en Ruby.

Une réponse définitive ne peut être donnée que par celui qui a inventé cette convention. Si elle a été inventée pour le Programmation de Ruby livre, ce serait soit Dave Thomas soit Andy Hunt, mais j'en doute un peu. Le livre est sorti en 2001, Ruby a commencé en 1993, comment faisaient-ils référence aux méthodes avant cela ?

2 votes

J'ai entendu dire que les programmeurs pragmatiques ont également créé la documentation pour Ruby (ils voulaient ensemencer la documentation afin que d'autres soient "dupés" pour l'enrichir). git peut vous ramener en 1998, vous pouvez donc vérifier si Class#method_name s'est produit avant que les progs prag l'ajoutent.

0 votes

J'ai depuis entendu dire que la documentation existait avant que les progs prag commencent à l'ajouter dans le code source.

3 votes

Peut-être qu'il imite l'aspect de la syntaxe de l'ancre # en HTML. Par exemple somesite.com/somepage#section .

18voto

Sarah Mei Points 10673

De la rdoc docs (c'est moi qui souligne) :

Noms des classes, des fichiers sources et tout nom de méthode contenant un underscore ou précédé d'un caractère dièse sont automatiquement hyperliens du texte du commentaire vers leur description.

8voto

ioquatix Points 341

La notation de hachage a été introduite dans "Programming Ruby - The Pragmatic Programmer's Guide", publié pour la première fois en décembre 2000.

La "Préface" contient "Conventions de notation" :

Dans le texte, Fred#doIt est une référence à une méthode d'instance ( doIt ) de class Fred alors que Fred.new [Dans d'autres documents Ruby, vous pouvez voir des méthodes de classe écrites comme suit Fred::new . Il s'agit d'une syntaxe Ruby parfaitement valide ; nous pensons simplement que Fred.new est moins gênant à lire.] est une méthode de classe, et Fred::EOF est une constante de classe.

Ce point est clarifié dans la 2e édition, publiée en octobre 2004 :

Dans le texte, Fred#do_something est une référence à une méthode d'instance (dans ce cas-ci do_something ) de class Fred , Fred.new est une méthode de classe, et Fred::EOF est une constante de classe. La décision d'utiliser un caractère dièse pour indiquer les méthodes d'instance a été difficile à prendre : ce n'est pas une syntaxe Ruby valide, mais nous avons pensé qu'il était important de différencier les méthodes d'instance et de classe d'une classe particulière. Lorsque vous nous voyez écrire File.read vous savez que nous parlons de la méthode de la classe. read . Lorsqu'on écrit à la place File#read nous faisons référence à la méthode d'instance read .

Ruby lui-même utilise cette notation :

> rvm use 1.9.3
Using ruby-1.9.3-p551

> Object.instance_method(:initialize)
=> #<UnboundMethod: Object(BasicObject)#initialize>

Il a été introduit et formalisé par Matz en février 2002 :

commit 8210c254bee19294af67bcee0e8f5e02ebb39a60
Author: matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date:   Tue Feb 5 07:56:31 2002 +0000

    * io.c (fptr_finalize): should raise error when fclose fails.

    * eval.c (method_inspect): proper output format to distinguish
      methods and singleton methods.

    git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2046 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

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