¿Debo usar alias o alias_method?

Resuelto ma11hew28 asked hace 13 años • 7 respuestas

Encontré una publicación de blog sobre aliasvs. alias_methodComo 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 aliasusado, pero alguien me dijo que alias_methodes 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í

ma11hew28 avatar Jan 22 '11 02:01 ma11hew28
Aceptado

alias_methodse puede redefinir si es necesario. (está definido en la Moduleclase).

aliasEl 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
Jacob Relkin avatar Jan 21 '2011 19:01 Jacob Relkin

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 aliases una palabra clave y tiene un alcance léxico. Significa que se trata selfcomo el valor de uno mismo en el momento en que se leyó el código fuente. Por el contrario, alias_methodse trata selfcomo el valor determinado en el tiempo de ejecución.

Fuente: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html

Darme avatar Dec 05 '2014 06:12 Darme

Un punto a favor de aliasen lugar de alias_methodes 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.

Bruno Rohée avatar Mar 03 '2011 18:03 Bruno Rohée

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
agenty avatar Dec 12 '2013 08:12 agenty