He encontrado un blog el alias
frente alias_method
. Como se muestra en el ejemplo dado en esa publicación de blog, simplemente quiero alias un método a otro dentro de la misma clase. ¿Cuál debería usar? Siempre lo veo alias
usado, pero alguien me dijo que alias_method
es mejor.
Uso de alias
class User
def full_name
puts "Johnnie Walker"
end
alias name full_name
end
User.new.name #=>Johnnie Walker
Uso de alias_method
class User
def full_name
puts "Johnnie Walker"
end
alias_method :name, :full_name
end
User.new.name #=>Johnnie Walker
alias
"aliasing métodos en el ámbito de clase léxica" yalias_method
"aliasing métodos de módulos, clases o clases singleton en tiempo de ejecución" github.com/bbatsov/ruby-style-guide#alias-method-lexicallyRespuestas:
alias_method
se puede redefinir si es necesario. (se define en laModule
clase).alias
El comportamiento de los cambios depende de su alcance y puede ser bastante impredecible a veces.Veredicto: Uso
alias_method
: te da mucha más flexibilidad.Uso:
fuente
alias :new_method_name :old_method_name
ORalias_method :new_method_name, :old_method_name
alias_method
se determina en tiempo de ejecución y no cuando se lee el código, comoalias
, por lo que se comporta más como lo esperaríamos .def
vsdefine_method
.: "define_method
se puede redefinir si es necesario. ( Está definido en laModule
clase).def
El comportamiento cambia dependiendo de su alcance y puede ser bastante impredecible a veces. Veredicto: Usodefine_method
: le da una tonelada más flexibilidad ".Además de la sintaxis, la principal diferencia está en el alcance :
En el caso anterior, el método "nombre" elige el método "nombre_completo" definido en la clase "Desarrollador". Ahora intentemos con
alias
.Con el uso del alias, el método "nombre" no puede elegir el método "nombre_completo" definido en Developer.
Esto se debe a que
alias
es una palabra clave y tiene un alcance léxico. Significa que se trataself
como el valor de self en el momento en que se leyó el código fuente. Por el contrario, sealias_method
trataself
como el valor determinado en el tiempo de ejecución.Fuente: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
fuente
Un punto a favor de en
alias
lugar dealias_method
es que su semántica es reconocida por rdoc, lo que lleva a referencias cruzadas claras en la documentación generada, mientras que rdoc ignora por completoalias_method
.fuente
alias_method
? Eso parece realmente poco probable, y si alguien hace eso, entonces deberían estar dispuestos a sufrir las consecuencias en RDoc. Si su punto es que es imposible, ¿por qué piensa eso y cómo cree que lo hace Yardoc?Creo que hay una regla no escrita (algo así como una convención) que dice que usar 'alias' solo para registrar un alias de nombre de método, significa que si desea darle al usuario de su código un método con más de un nombre:
Si necesita extender su código, use la alternativa alternativa ruby.
fuente
Un año después de hacer la pregunta llega un nuevo artículo sobre el tema:
http://erniemiller.org/2014/10/23/in-defense-of-alias/
Parece que "tantos hombres, tantas mentes". Desde el primer artículo, el autor anima a usar
alias_method
, mientras que el último sugiere usaralias
.Sin embargo, hay una descripción general común de estos métodos en las publicaciones de blog y las respuestas anteriores:
alias
cuando desee limitar el alias al alcance donde está definidoalias_method
para permitir que las clases heredadas accedan a élfuente
Los contribuyentes de gemas rubocop proponen en su Guía de estilo Ruby :
fuente
alias_method new_method , old_method
old_method se declarará en una clase o módulo que se heredará ahora a nuestra clase donde se usará new_method .
Estos pueden ser variables o método ambos.
Supongamos que Class_1 tiene old_method, y Class_2 y Class_3 ambos heredan Class_1.
Si la inicialización de Class_2 y Class_3 se realiza en Class_1, ambos pueden tener un nombre diferente en Class_2 y Class_3 y su uso.
fuente