1 - est-il toujours utilisé?
Apparemment oui, alias_method_chain()
est still used in Rails (de la version 3.0.0).
2 - Quand utiliseriez-vous alias_method_chain et pourquoi?
(Note:. ce qui suit est en grande partie basée sur la discussion de alias_method_chain()
en Metaprogramming Ruby par Paolo Perrotta, qui est un excellent livre que vous devriez obtenir vos mains sur)
Commençons par un exemple de base:
class Klass
def salute
puts "Aloha!"
end
end
Klass.new.salute # => Aloha!
supposons maintenant que nous voulons entourer Klass#salute()
avec le comportement de l'exploitation forestière. Nous pouvons faire ce que Perrotta appelle un alias autour:
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
Nous avons défini une nouvelle méthode appelée salute_with_log()
et à salute()
un alias. Le code qui appelait salute()
fonctionne toujours, mais il obtient également le nouveau comportement de journalisation.Nous avons également défini un alias à l'salute()
d'origine, afin que nous puissions saluer encore sans vous connecter:
Klass.new.salute_without_log # => Aloha!
Ainsi, salute()
est maintenant appelé salute_without_log()
. Si nous voulons la journalisation, nous pouvons appeler salute_with_log()
ou salute()
, qui sont des alias de la même méthode. Confus? Bien!
Selon Perrotta, ce genre d'environ alias est très commun dans Rails:
un autre exemple de Rails résoudre un problème de sa propre manière. Il y a quelques versions , le code Rails contenait plusieurs instances du même idiome: un Autour Alias (155) a été utilisé pour ajouter une fonctionnalité à une méthode, et l'ancienne version de la méthode a été renommé quelque chose comme method_without_feature()
. En dehors de les noms des méthodes qui ont changé chaque fois , le code qui a fait cela était toujours le même, dupliqués partout l'endroit. Dans la plupart des langues, ne peut pas éviter ce type de duplication. Dans Ruby, vous pouvez saupoudrer de magie de métaprogrammation sur votre modèle et l'extraire dans sa propre méthode ... et ainsi est né alias_method_chain()
.
En d'autres termes, vous fournir la méthode originale, foo()
, et la méthode améliorée, foo_with_feature()
, et vous vous retrouvez avec trois méthodes: foo()
, foo_with_feature()
et foo_without_feature()
. Les deux premiers incluent la fonctionnalité, tandis que le troisième ne le fait pas. Au lieu de dupliquer ces alias tout autour, alias_method_chain()
provided by ActiveSupport fait tous les alias pour vous.
+1 pour dire "Confus? Bon!" – jperelli
et petite addition: maintenant nous pouvons simplement taper '' 'alias_method_chain: foo,: feature''' et nous aurons 3 méthodes:' '' foo''', '' 'foo_with_feature''',' '' foo_without_feature '' 'qui sont correctement aliasés comme * Yases Sulaiman * décrivent avant – freemanoid
" Toute technologie suffisamment avancée est indiscernable de la magie. " Arthur C. Clarke –