ruby - ¿Debo usar alias o alias_metodo?
(8)
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 #=> ''Gekky geek''
En el caso anterior, el método "nombre" elige el método "nombre completo" definido en la clase "Desarrollador". Ahora vamos a intentar 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 del alias, el método "nombre" no puede seleccionar el método "nombre completo" definido en el desarrollador.
Esto se debe a que alias
es una palabra clave y tiene un ámbito léxico. Significa que se trata a self
como el valor de sí mismo en el momento en que se leyó el código fuente. En contraste, alias_method
trata a self
como el valor determinado en el tiempo de ejecución.
Fuente: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
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 unir un método a otro dentro de la misma clase. ¿Qué debo usar? Siempre veo un 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
Aunque puede ser menor, pero hay dos cosas que me gustan del alias, más que alias_method:
(1) el alias es más corto
y
(2) No tienes que escribir el,
Esto es poco, lo sé, pero cuando haces esto cientos de veces a medida que pasan los años, simplemente tiendes a preferir el alias siempre que sea posible
Creo que hay una regla no escrita (algo así como una convención) que dice 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:
class Engine
def start
#code goes here
end
alias run start
end
Si necesita extender su código, use la alternativa de ruby meta.
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
Esto ahora se maneja en la github.com/bbatsov/ruby-style-guide#alias-method-lexically :
Preferir el alias cuando los métodos de alias en el ámbito de la clase léxica, ya que la resolución del yo en este contexto también es léxico, y comunica claramente al usuario que la indirección de su alias no se modificará en el tiempo de ejecución o por cualquier subclase, a menos que se haga explícito.
class Westerner
def first_name
@names.first
end
alias given_name first_name
end
Siempre use alias_method cuando los métodos de aliasing de módulos, clases o clases singleton en tiempo de ejecución, ya que el alcance léxico del alias conduce a la imprevisibilidad en estos casos
module Mononymous
def self.included(other)
other.class_eval { alias_method :full_name, :given_name }
end
end
class Sting < Westerner
include Mononymous
end
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 recomienda utilizar alias_method
, mientras que el último sugiere usar un alias
.
Sin embargo, hay una descripción general de estos métodos en las entradas de blog y en las respuestas anteriores:
- usa un
alias
cuando quieras limitar el alias al alcance donde está definido - usa
alias_method
para permitir que las clases heredadas accedan a él
Un punto a favor del alias
lugar de alias_method
es que su semántica es reconocida por rdoc, lo que lleva a referencias cruzadas nítidas en la documentación generada, mientras que rdoc ignora completamente alias_method
.
alias_method
puede ser redefinido si es necesario. (Se define en la clase Module
.)
El comportamiento de alias
cambia según su alcance y puede ser bastante impredecible a veces.
Veredicto: use alias_method
- le da alias_method
más flexibilidad.
Uso:
def foo
"foo"
end
alias_method :baz, :foo
alias_method new_method , old_method
old_method se declarará en una clase o módulo que se está heredando 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, entonces ambos pueden tener un nombre diferente en Class_2 y Class_3 y su uso.