Question

Par exemple, je l'ai toujours vu des méthodes appelées String#split, mais jamais String.split, ce qui semble un peu plus logique. Ou peut-être même String::split, parce que vous pourriez envisager #split être dans l'espace de noms String. J'ai même vu la seule méthode, lorsque la classe est supposée / implicite (#split).

Je comprends que ce sont les méthodes sont ainsi identifiées dans ri. Ce qui est arrivé en premier?

Est-ce à différencier, par exemple, les méthodes de champs? Je l'ai aussi entendu dire que cela aide les méthodes d'instance différencie des méthodes de classe. Mais où at-il commencé?

Était-ce utile?

La solution

La différence indique comment accéder à ces méthodes.

Méthodes de classe utiliser le séparateur de :: pour indiquer que message peut être envoyé à l'objet de classe / module, alors que méthodes d'instance utiliser le séparateur de # pour indiquer que la boîte de message être envoyé à une instance d'objet.

Je vais choisir la classe Complex (en Ruby 1.9) pour démontrer la différence. Vous avez à la fois Complex::rect et Complex#rect. Ces méthodes ont différentes arité et ils servent à des fins totalement différentes. Complex::rect prend un vrai et un argument imaginaire, renvoyant une nouvelle instance de Complex, tandis que Complex#rect retourne un tableau des composantes réelles et imaginaires de l'instance.

ruby-1.9.1-p378 > x = Complex.rect(1,5)
 => (1+5i) 
ruby-1.9.1-p378 > x.rect
 => [1, 5] 
ruby-1.9.1-p378 > x.rect(2, 4) # what would this even do?
ArgumentError: wrong number of arguments(2 for 0)
    from (irb):4:in `rect'
    from (irb):4
    from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>'

Je pense que la raison pour laquelle ils n'utilisent pas . comme séparateur pour tout est qu'il serait douteux que la méthode appartient à une classe ou une instance. Maintenant que je suis habitué à Ruby faire cela, je vois effectivement comme un inconvénient à d'autres conventions de langues, pour être honnête.

En outre, cela est un peu d'un sujet complètement différent de champs parce que tous les messages que vous pouvez envoyer des messages, à proprement parler, même si elle regarde comme un champ accessible au public . La chose la plus proche, vous devez les champs sont des attributs ou des variables d'instance, bien sûr, qui sont toujours préfixées avec @ et ne sont pas directement accessible depuis l'extérieur de l'instance, sauf si vous utilisez l'héritage ou Object#instance_variable_get / _set.

En ce qui concerne plus précisément la raison pour laquelle ils ont choisi :: et #? :: fait sens pour moi parce conventionnellement séparé namespaces, mais # était probablement juste un symbole qui n'a pas été utilisé dans d'autres nomenclature et pourrait clairement être reconnue comme un séparateur par exemple méthode.

Autres conseils

  

Je comprends que ce sont les méthodes sont ainsi identifiées dans ri. Ce qui est arrivé en premier?

Oui, c'est d'où il vient. Lorsque vous utilisez #, il hyperliens automatiquement vos méthodes, de sorte que les références à d'autres méthodes dans la documentation a commencé à être préfixé par le signe #. Voir :

  

Les noms des classes, fichiers source, et les noms de méthodes contenant un trait de soulignement ou précédé d'un caractère de hachage sont automatiquement hyperlinked du texte de commentaire à leur description.

Vous ne pouvez pas invoquer en fait une méthode de cette façon, cependant. Mais cela ne devrait pas être surprenant; après tout, <cref ...> est une déclaration invalide en C # en dépit d'être une étiquette de documentation valide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top