182 votes

Envoyer rubis vs __send__

Je comprends la notion de `` mais je vais essayer de comprendre pourquoi on peut appeler cela les deux sens. Les Koans Ruby implique qu’il y a une raison plus que fournir beaucoup de façons différentes de faire la même chose. Voici deux exemples de son utilisation :

Quelqu'un a une idée à ce sujet ?

276voto

sepp2k Points 157757

Certaines classes (par exemple la bibliothèque standard de la classe socket) définir leur propre send méthode qui n'a rien à voir avec Object#send. Donc, si vous voulez travailler avec des objets de n'importe quelle classe, vous devez utiliser __send__ pour être sur le côté sécuritaire.

Maintenant que la question, pourquoi n'est - send , et pas seulement __send__. Si il n'y avait que __send__ nom send pourrait être utilisé par d'autres classes sans aucune confusion. La raison c'est qu' send a existé d'abord, et plus tard, il a réalisé que le nom de l' send pourrait aussi utilement être utilisé dans d'autres contextes, afin __send__ a été ajouté (c'est la même chose qui s'est passé avec id et object_id par la voie).

37voto

Thiago Silveira Points 2668

Si vous avez vraiment besoin d' send , pour se comporter comme il le ferait normalement, vous devez utiliser __send__, car il n'est pas (ne devrait pas) être surchargée. À l'aide de __send__ est particulièrement utile dans la métaprogrammation, lorsque vous ne savez pas quelles sont les méthodes de la classe en cours de manipulation définit. Il pourrait avoir remplacé send.

Regarder:

class Foo
  def bar?
    true
  end

  def send(*args)
    false
  end
end

foo = Foo.new
foo.send(:bar?)
# => false
foo.__send__(:bar?)
# => true

Si vous substituez __send__, Ruby va émettre un avertissement:

avertissement: la redéfinition `__envoyez__ " peut causer de graves problèmes

Certains cas où il serait utile de remplacer send , lorsque ce nom est approprié, comme la transmission de messages, prise de classes, etc.

12voto

Andrew Grimm Points 22996

``Il existe donc il ne peut pas être trop écrit par accident.

Quant à pourquoi existe : je ne peux pas parler pour tout le monde, mais est plus joli que , donc j’utilise à moins que j’ai besoin d’utiliser `` .

6voto

Boris Stitnicky Points 5409

En dehors de ce que d’autres vous l’ai dit, et ce qui revient à dire que et sont deux alias de la même méthode, vous pourriez être intéressé par le troisième, possibilité de différents somwhat, qui est `` . Exemple :

Mise à jour : Depuis Ruby 2.1, et méthodes devient publiques, donc l’exemple ci-dessus ne fonctionnerait pas plus.

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