有没有办法使用around / before / after过滤器包装我自己的命名空间中定义的所有方法,以便我可以记录调用事件和未使用的方法?
答案 0 :(得分:1)
要做你想做的事,还有很多工作要做。幸运的是,你并不是唯一想要它的人,而且之前已经完成了(正如我在评论中所说的那样,在“面向方面的编程”中。
以下是使用Aspector gem的示例:
#!/usr/bin/env ruby
require 'aspector'
watcher = Aspector do
around(/.*/, except: Object.methods) do |proxy, *args, &block|
puts "before #{proxy.name} on #{proxy.receiver}"
proxy.call(*args, &block)
puts "after #{proxy.name} on #{proxy.receiver}"
end
end
class Foo
def self.klass
puts "class method"
end
def inst
puts "instance method"
end
end
watcher.apply(Foo)
watcher.apply(Foo, class_methods: true)
# => before singleton_method_added on Foo
# after singleton_method_added on Foo
Foo.klass
# => before klass on Foo
# class method
# after klass on Foo
Foo.new.inst
# => before inst on #<Foo:0x007f9b648c83c0>
# instance method
# after inst on #<Foo:0x007f9b648c83c0>