¿Debo usar alias o el método alias?
Encontré una entrada de blog en alias
vs. alias_method
. Como se muestra en el ejemplo dado en esa publicación del blog, simplemente quiero alias de un método a otro dentro de la misma clase. ¿Cuál debo usar? Siempre veo alias
usado, pero alguien me dijo alias_method
es mejor.
Uso del 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
8 answers
alias_method
puede ser redefinido si es necesario. (se define en la clase Module
.)
alias
's el comportamiento cambia dependiendo de su alcance y puede ser bastante impredecible a veces.
Veredicto: Usa alias_method
- te da mucha más flexibilidad.
Uso:
def foo
"foo"
end
alias_method :baz, :foo
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-07 19:58:35
Aparte de la sintaxis, la principal diferencia está en el ámbito :
# 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 "name" elige el método "full_name" definido en la clase "Developer". Ahora vamos a probar 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 "name" no es capaz de elegir el método "full_name" definido en el Desarrollador.
Esto se debe a que alias
es una palabra clave y tiene un ámbito léxico. Significa que trata self
como el valor de self en el momento en que se leyó el código fuente . Por el contrario, 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-05 06:40:28
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:
class Engine
def start
#code goes here
end
alias run start
end
Si necesitas extender tu código, usa la alternativa 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-29 12:42:43
Un punto a favor de alias
en lugar de alias_method
es que su semántica es reconocida por rdoc, lo que lleva a referencias cruzadas ordenadas en la documentación generada, mientras que rdoc ignora completamente alias_method
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-03 18:22:57
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."Del artículo anterior autor anima a usar alias_method
, mientras que el último sugiere usar alias
.
Sin embargo, hay una visión general común de estos métodos en ambos blogposts y respuestas anteriores:
- use
alias
cuando desee limitar el aliasing al ámbito donde está definido - use
alias_method
para permitir que las clases heredadas accedan a él
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-11 01:03:53
Esto se maneja ahora en la Guía de estilo de Ruby :
Prefiera alias al aliasear métodos en el ámbito de clase léxica como el la resolución del yo en este contexto también es léxica, y comunica claramente al usuario que la indirección de su alias no se alterará en tiempo de ejecución ni por ninguna subclase a menos que se realice expresa.
class Westerner
def first_name
@names.first
end
alias given_name first_name
end
Utilice siempre alias_method al aliasing métodos de módulos, clases, o clases singleton en tiempo de ejecución, como el ámbito léxico de alias conduce a 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-10 12:10:11
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 new_method se utilizará.
Estos pueden ser variables o métodos 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, ambas pueden tener un nombre diferente en Class_2 y Class_3 y su uso.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-10 11:43:23
Aunque puede ser menor, pero hay dos cosas que me gustan de alias, más que alias_method:
(1) alias es más corto
Y
(2) No tiene que escribir el ,
Esto es poco, lo sé, pero cuando haces esto unos cientos de veces a medida que pasan los años, simplemente tiendes a preferir alias siempre que sea posible
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-29 15:27:06