Sto giocando con le funzioni di metaprogrammazione di Ruby e lo trovo un po 'peloso. Sto cercando di avvolgere una chiamata di metodo usando un modulo. Attualmente, sto facendo questo:Estensione di un metodo di classe in un modulo
module Bar
module ClassMethods
def wrap(method)
class_eval do
old_method = "wrapped_#{method}".to_sym
unless respond_to? old_method
alias_method old_method, method
define_method method do |*args|
send old_method, *args
end
end
end
end
end
def self.included(base)
base.extend ClassMethods
end
end
class Foo
include Bar
def bar(arg = 'foo')
puts arg
end
wrap :bar
end
Tre domande:
Esiste un modo per fare questo senza rinominare il metodo, in modo da consentire l'uso di
super
? O qualcosa di più pulito/più corto?C'è un modo pulito per impostare i valori predefiniti?
Esiste un modo per spostare ulteriormente la chiamata
wrap :bar
?
Nella vita reale userei l'ereditarietà di classe per quello. –
Anch'io, ma sto cercando di dare un senso a tutto questo. :-) –
correlati: http://stackoverflow.com/questions/6631182/difference-between-class-eval-and-instance-eval-in-a-module –