Dans un test unitaire, j'ai besoin de tester si les méthodes d'alias définies par Alias_Method ont été correctement définies. Je pourrais simplement utiliser les mêmes tests sur les alias utilisés pour leurs originaux, mais je me demande s'il existe une solution plus définitive ou plus efficace. Par exemple, existe-t-il un moyen de 1) une déréférence un alias de méthode et de renvoyer son nom d'origine, 2) Obtenez et comparez une sorte d'identifiant ou d'adresse de méthode sous-jacente, ou 3) obtenir et comparer les définitions de la méthode? Par exemple: suggestions? P> p>
3 Réponses :
Selon la documentation de Méthode ,
Deux objets de méthode sont égaux si cela sont liés au même objet et contenir le même corps. P> blockQuote>
appeler
méthode d'objet # / code>
et comparer la méthodecode> Les objets qu'il renvoie vérifiera que les méthodes sont équivalentes: p>
xxx pré> p>
J'étais sûr que je me suis souvenu que cela ne fonctionnait pas, mais je viens de l'essayer de confirmer et cela fonctionne de manière cohérente dans Ruby 1.8, 1.9 et MacRuby. Mais je ne le vois toujours pas à Rubyspec, il ne fonctionnera donc probablement pas sur une implémentation non liée.
De plus, en général, des méthodes qui ont simplement des corps identiques, mais ne sont pas copiées une de l'autre sont catégoriquement pas i> égales. Preuve: classe.new {def foo () fin; DEF bar () fin; met instance_method (: foo) == instance_method (: bar)} code>
@CHUCK: Merci d'avoir souligné cela. J'aurais dû essayer.
De plus, "retourne true sur les méthodes aliasées" de Github.com/ rubyspec / rubyspec / blob / maître / noyau / ... + GITUB.COM/RUBYSPEC/RUBYSPEC/BLOB/MASTER/CORE/METHOD/SHARED/ ... semble couvrir m.method (: bar) == m.method ( : foo) code> quand on est un alias de l'autre.
La méthode de BK1E fonctionne la plupart du temps, mais je viens de frapper le cas où il ne fonctionne pas: La sortie est produite dans Ruby 1.9, pas sûr si c'est un Bug ou non depuis Ruby 1.8 produit Ma solution de contournement est simple - alias la méthode originale et testez l'égalité des deux alias: p> espoir Cela aide. p> voir http://bugs.ruby-lang.org/issues/7613 p> SO vrai code> pour la dernière ligne. Donc, si vous utilisez 1.9, soyez prudent si vous aliasez une méthode de classe héritée (comme la classe # nouvelle), ces deux méthodes sont liées au même objet (l'objet de la classe
flux code>), mais ils sont considérés comme pas équivalents par Ruby 1.9. P>
méthode # == code> devrait retourner faux dans ce cas depuis un
super code> appel serait d'appeler des méthodes différentes; ce n'est pas un bug. p> p>
appeler La réponse est la suivante: P> myClass.instance_mesthod (: foo) code> résultera UNBOULEMETHOD instance, qui a
EQL? code> méthode.
describe MyClass do
subject { described_class }
specify do
expect(subject.instance_method(:foo)).to be_eql(subject.instance_method(:bar))
end
end
Dupliqué possible de est-il possible d'identifier des méthodes aliasées dans Ruby? < / a>