是否有快速方法来跟踪对象上调用的方法?通常,当我在公共界面下方的某个级别处使用gem时,我会遇到难以追踪的错误。最终,我最终通过源代码跟踪对象并将所有内容保留在我的脑海中。
但是能够在对象上调用像#log_method_calls
这样的东西会很好,比如说,调用它的所有方法都会被打印到stdout或者其他东西。有没有办法实现这个目标?
答案 0 :(得分: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
如果不可能,您仍然可以使用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)