是否有一种直接的方式来记录在Ruby中的对象上调用的方法?

Ste*_*ven 7 ruby

有没有快速的方法来跟踪对象上调用的方法?通常,当我在公共界面下方的某个级别处使用gem时,我会遇到难以追踪的错误.最终,我最终通过源代码跟踪对象并将所有内容保留在我的脑海中.

但是能够调用像#log_method_calls对象这样的东西会很好,比如说,调用它的所有方法都会打印到stdout或者其他东西.有没有办法实现这个目标?

Dut*_*tow 5

根据具体情况,有几种方法可以做到这一点.

如果可以创建一个新对象而不是被观察者,则可以使用method_missing轻松编写一个观察者类.

class LogProxy  
  def initialize obj
    @obj = obj
  end

  def method_missing(name, *args)
    puts "#{name} => #{args.to_s}"  
    @desk.send(name, *args)
  end
end
Run Code Online (Sandbox Code Playgroud)

如果不可能,您仍然可以使用alias_method.这有点棘手,但是使用Module.instance_methods可以链接每个方法.

就像是:

module Logger

  def self.included(mod)
    mod.instance_methods.each do |m|
      next if m =~ /with_logging/
      next if m =~ /without_logging/

      mod.class_eval do

        define_method "#{m}_with_logging" do |*args|
          puts "#{m} called #{args.to_s}"
          self.send_without_logging "#{m}_without_logging", *args
        end

        alias_method "#{m}_without_logging", m
        alias_method m, "#{m}_with_logging"
      end

    end
  end

end

TargetClass.send(:include, Logger)
Run Code Online (Sandbox Code Playgroud)