¿Debo usar alias o alias_method?
Encontré una publicación de blog sobre alias
vs. alias_method
Como se muestra en el ejemplo dado en esa publicación de blog, simplemente quiero asignar un alias a un método con otro dentro de la misma clase. ¿Cuál debo 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
Enlace a la publicación del blog aquí
alias_method
se puede redefinir si es necesario. (está definido en la Module
clase).
alias
El comportamiento de cambia según su alcance y, en ocasiones, puede ser bastante impredecible.
Veredicto: Úselo alias_method
: le brinda mucha más flexibilidad.
Uso:
def foo
"foo"
end
alias_method :baz, :foo
Aparte de la sintaxis, la principal diferencia está en el alcance :
# scoping with alias_method
class User
def full_name
puts "Johnnie Walker"
end
def self.add_rename
alias_method :name, :full_name
end
end
class Developer < User
def full_name
puts "Geeky geek"
end
add_rename
end
Developer.new.name #=> 'Geeky geek'
En el caso anterior, el método "nombre" elige el método "nombre_completo" definido en la clase "Desarrollador". Ahora probemos con alias
.
class User
def full_name
puts "Johnnie Walker"
end
def self.add_rename
alias name full_name
end
end
class Developer < User
def full_name
puts "Geeky geek"
end
add_rename
end
Developer.new.name #=> 'Johnnie Walker'
Con el uso de 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 trata self
como el valor de uno mismo en el momento en que se leyó el código fuente. Por el contrario, alias_method
se trata self
como el valor determinado en el tiempo de ejecución.
Fuente: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
Un punto a favor de alias
en lugar de alias_method
es que rdoc reconoce su semántica, lo que genera claras referencias cruzadas en la documentación generada, mientras que rdoc lo ignora por completo alias_method
.
Creo que hay una regla no escrita (algo así como una convención) que dice que se debe usar 'alias' solo para registrar un alias de nombre de método, es decir, si desea darle al usuario de su código un método con más de un nombre:
class Engine
def start
#code goes here
end
alias run start
end
Si necesita ampliar su código, utilice la meta alternativa de Ruby.
class Engine
def start
puts "start me"
end
end
Engine.new.start() # => start me
Engine.class_eval do
unless method_defined?(:run)
alias_method :run, :start
define_method(:start) do
puts "'before' extension"
run()
puts "'after' extension"
end
end
end
Engine.new.start
# => 'before' extension
# => start me
# => 'after' extension
Engine.new.run # => start me