2011-01-21 17 views
317

Encontré una publicación de blog en alias frente a alias_method. Como se muestra en el ejemplo dado en esa publicación de blog, simplemente quiero alias un método a otro dentro de la misma clase. ¿Qué debería usar? Siempre veo alias usado, pero alguien me dijo que alias_method es mejor.¿Debo usar alias o alias_method?

El 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 

Blog post link here

+4

¿Esa publicación no responde tu pregunta? – marcog

+3

@marcog: Lo he leído, y no estoy convencido. Definir alias dentro de los métodos, eso no es algo que uno deba hacer a menudo. –

+2

@digitalextremist enlace funciona –

Respuesta

355

alias_method puede ser redefinido si es necesario. (se define en la clase Module).

alias El comportamiento cambia según su alcance y puede ser bastante impredecible a veces.

Veredicto: Use alias_method - le da una tonelada más de flexibilidad.

Uso:

def foo 
    "foo" 
end 

alias_method :baz, :foo 
+39

¿Qué quiere decir con impredecible. Naïvely, uno diría que la opción que es menos flexible será más predecible. Además, ¿puede proporcionar algún ejemplo práctico de cómo beneficiarse de la redefinición de alias_method? –

+22

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

+7

caso de ejemplo de uso: 'alias: new_method_name: old_method_name' OR' alias_method: new_method_name,: old_method_name' –

30

Un punto a favor de alias en lugar de alias_method es que su semántica es reconocido por rdoc, lo que lleva a las referencias cruzadas ordenadas en la documentación generada, mientras que ignoran por completo rdoc alias_method.

+54

Quizás RDoc debería comenzar a tratar alias_method de la misma manera que alias. Deberíamos contarles al respecto;) –

+9

Totalmente de acuerdo. Yard maneja esto bastante bien si mal no recuerdo ... –

+16

Una razón más para usar [Yardoc] (http://yardoc.org/) en lugar de RDoc. – iain

-18

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) Usted no tiene para escribir el,

Esto es poco, lo sé, pero cuando lo hace esto un par de cientos de veces como pasan los años, sólo tiene que tienden a preferir alias siempre que sea posible

+10

Me preguntaba por qué esto tenía tantos votos negativos y ningún comentario. Después de leer, sé por qué. – DickieBoy

33

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 le quiere dar 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 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 
16

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 autor anterior del artículo anima a usar alias_method, mientras que el último sugiere usar alias.

Sin embargo hay una visión común de estos métodos en ambas entradas del blog y respuestas anteriores:

  • uso alias cuando se quiere limitar aliasing al ámbito donde se define
  • uso alias_method para permitir que las clases heredadas de acceso que
36

Aparte de la sintaxis, la diferencia principal 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" selecciona el método "full_name" definido en la clase "Desarrollador". Ahora intentemos 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 “nombre” método no es capaz de escoger el método “FULL_NAME” se define en el desarrollador.

Esto es porque alias es una palabra clave y tiene un ámbito léxico. Significa que trata self como el valor de uno mismo en el momento en que se leyó el código fuente. En contraste, alias_method 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

0

Este que ahora se realiza en el Ruby Style Guide:

Prefiero alias cuando los métodos de distorsión en ámbito de la clase léxica ya que la resolución de sí mismo en este contexto es también léxica, y comunica claramente al usuario que la indirección de su alias no se verá alterada en tiempo de ejecución ni por ninguna subclase, a menos que se especifique explícita.

class Westerner 
    def first_name 
    @names.first 
    end 

alias given_name first_name 
end 

Utilizar siempre alias_method cuando aliasing métodos de módulos, clases o clases singleton en tiempo de ejecución, ya que 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