ruby alias

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

Blog post enlace aquí


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.