监视ruby中的每个方法调用

时间:2017-02-02 23:48:03

标签: ruby

有没有办法使用around / before / after过滤器包装我自己的命名空间中定义的所有方法,以便我可以记录调用事件和未使用的方法?

1 个答案:

答案 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>