1 - ¿Todavía se usa?
Al parecer sí, es alias_method_chain()
still used in Rails (en la versión 3.0.0).
2 - ¿Cuándo utilizaría alias_method_chain y por qué?
(Nota:. el se basa en gran parte en la discusión de alias_method_chain()
en Metaprogramming Ruby de Paolo Perrotta, que es un excelente libro que usted debe tener en sus manos después de)
Vamos a empezar con un ejemplo básico:
class Klass
def salute
puts "Aloha!"
end
end
Klass.new.salute # => Aloha!
supongamos ahora que queremos rodear Klass#salute()
con comportamiento de registro. Podemos hacer que lo que llama un Perrotta alrededor de alias:
class Klass
def salute_with_log
puts "Calling method..."
salute_without_log
puts "...Method called"
end
alias_method :salute_without_log, :salute
alias_method :salute, :salute_with_log
end
Klass.new.salute
# Prints the following:
# Calling method...
# Aloha!
# ...Method called
hemos definido un nuevo método llamado salute_with_log()
y alias a salute()
. El código que solía llamar a salute()
todavía funciona, pero también obtiene el nuevo comportamiento de registro.También se define un alias a la original salute()
, por lo que todavía podemos saludar sin registro:
Klass.new.salute_without_log # => Aloha!
Así, salute()
ahora se llama salute_without_log()
. Si queremos iniciar sesión, podemos llamar al salute_with_log()
o al salute()
, que son alias del mismo método. ¿Confuso? ¡Bueno!
Según Perrotta, este tipo de alrededor de alias es muy común en los rieles:
ver otro ejemplo de rieles resolver un problema a su manera. Hace unos versiones, el código de Rails contenía muchas instancias del mismo lenguaje: una fue utilizado para añadir una característica a un método Alrededor Alias (155), y la vieja versión del método fue renombrado a algo así como method_without_feature()
. Aparte de los nombres del método, que cambiaron cada vez, el código que hizo esto fue siempre el mismo, duplicado en el lugar. En la mayoría de los idiomas, no puede evitar ese tipo de duplicación. En Ruby, puede rociar un poco de magia de metaprogramación sobre su patrón y extraerlo en su propio método ... y así nació alias_method_chain()
.
En otras palabras, que proporcionan el método original, foo()
, y el método mejorado, foo_with_feature()
, y se termina con tres métodos: foo()
, foo_with_feature()
y foo_without_feature()
. Los primeros dos incluyen la función, mientras que el tercero no. En lugar de duplicar estos alias por todos lados, alias_method_chain()
provided by ActiveSupport hace todo el alias por usted.
+1 por decir "¿Confundido? ¡Bien!" – jperelli
y una pequeña adición: así que ahora podemos simplemente escribir '' 'alias_method_chain: foo,: feature''' y tendremos 3 métodos:' '' foo''', '' 'foo_with_feature''',' '' foo_without_feature '' 'que están correctamente alias como * Yases Sulaiman * describe antes de – freemanoid
" Cualquier tecnología suficientemente avanzada es indistinguible de la magia ". Arthur C. Clarke –