J'ai trouvé un billet de blog sur alias
contre alias_method
. Comme le montre l'exemple donné dans ce billet de blog, je veux simplement alias une méthode à une autre dans la même classe. Que dois-je utiliser? Je vois toujours alias
utilisé, mais quelqu'un m'a dit que alias_method
c'est mieux.
Utilisation de l'alias
class User
def full_name
puts "Johnnie Walker"
end
alias name full_name
end
User.new.name #=>Johnnie Walker
Utilisation de alias_method
class User
def full_name
puts "Johnnie Walker"
end
alias_method :name, :full_name
end
User.new.name #=>Johnnie Walker
alias
"lors de l'aliasing des méthodes dans la portée des classes lexicales" etalias_method
"lors de l'aliasing des méthodes des modules, des classes ou des classes singleton à l'exécution" github.com/bbatsov/ruby-style-guide#alias-method-lexicallyRéponses:
alias_method
peut être redéfini si besoin est. (il est défini dans laModule
classe.)alias
Le comportement de change en fonction de sa portée et peut parfois être assez imprévisible.Verdict: Utilisez
alias_method
- cela vous donne une tonne de flexibilité.Usage:
la source
alias :new_method_name :old_method_name
OUalias_method :new_method_name, :old_method_name
alias_method
est déterminé au moment de l'exécution et non pas lorsque le code est lu, par exemplealias
, il se comporte donc plus comme prévu .def
vsdefine_method
.: "define_method
peut être redéfini si besoin est. (Il est défini dans laModule
classe.)def
Le comportement du changement change en fonction de sa portée et peut être assez imprévisible parfois. Verdict: Utilisezdefine_method
- cela vous donne une tonne plus de flexibilité. "Outre la syntaxe, la principale différence réside dans la portée :
Dans le cas ci-dessus, la méthode "nom" sélectionne la méthode "nom_complet" définie dans la classe "Développeur". Essayons maintenant avec
alias
.Avec l'utilisation de l'alias, la méthode «nom» n'est pas en mesure de choisir la méthode «full_name» définie dans Developer.
C'est parce que
alias
c'est un mot-clé et il a une portée lexicale. Cela signifie qu'il est considéréself
comme la valeur de soi au moment où le code source a été lu.alias_method
Traite en revancheself
comme la valeur déterminée au moment de l'exécution.Source: http://blog.bigbinary.com/2012/01/08/08/alias-vs-alias-method.html
la source
Un point en faveur de
alias
lieu dealias_method
est que sa sémantique est reconnue par rdoc, conduisant à des références croisées soignées dans la documentation générée, tandis que rdoc ignore complètementalias_method
.la source
alias_method
? Cela semble vraiment peu probable, et si quelqu'un le fait, il devrait être prêt à en subir les conséquences dans RDoc. Si vous dites que c'est impossible, alors pourquoi pensez-vous cela et comment pensez-vous que Yardoc le fait?Je pense qu'il y a une règle non écrite (quelque chose comme une convention) qui dit d'utiliser 'alias' juste pour enregistrer un alias de nom de méthode, signifie que si vous aimez donner à l'utilisateur de votre code une méthode avec plus d'un nom:
Si vous devez étendre votre code, utilisez la méta alternative ruby.
la source
Un an après avoir posé la question, vient un nouvel article sur le sujet:
http://erniemiller.org/2014/10/23/in-defense-of-alias/
Il semble que "tant d'hommes, tant d'esprits". De l'ancien article, l'auteur encourage à utiliser
alias_method
, tandis que ce dernier suggère d'utiliseralias
.Cependant, il existe un aperçu commun de ces méthodes dans les articles de blog et les réponses ci-dessus:
alias
lorsque vous souhaitez limiter l'aliasing à l'étendue où il est définialias_method
pour permettre aux classes héritées d'y accéderla source
Les contributeurs de rubocop gem proposent dans leur Ruby Style Guide :
la source
alias_method new_method , old_method
old_method sera déclaré dans une classe ou un module qui est maintenant hérité de notre classe où new_method sera utilisé.
ceux-ci peuvent être variables ou la méthode à la fois.
Supposons que Class_1 possède old_method et que Class_2 et Class_3 héritent tous les deux de Class_1.
Si l'initialisation de Class_2 et Class_3 est effectuée dans Class_1, les deux peuvent avoir un nom différent dans Class_2 et Class_3 et son utilisation.
la source