¿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

Enlace de entrada de blog aquí

 331
Author: philant, 2011-01-21

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
 369
Author: Jacob Relkin,
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

 43
Author: Darme,
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
 33
Author: agenty,
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.

 32
Author: Bruno Rohée,
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
 20
Author: Kamil Lelonek,
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
 2
Author: Doktor OSwaldo,
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.

 0
Author: Ajay,
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

 -18
Author: shevy,
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