我在玩ruby的元编程功能,并且发现它有点多毛。我试图用一个模块来包装一个方法调用。目前,我这样做:在模块中扩展类方法
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
三个问题:
有没有办法做到这一点不重命名的方法,从而允许使用的
super
?或者更干净/更短的东西?是否有一个干净的方式来设置默认值?
是否有办法将
wrap :bar
呼叫进一步调高?
在现实生活中,我会使用类继承。 –
我也是,但我试图理解这一切。 :-) –
相关:http://stackoverflow.com/questions/6631182/difference-between-class-eval-and-instance-eval-in-a-module –