有沒有一種快速的方法來跟蹤被調用的對象的方法?通常,當我在低於其公共界面的級別上使用gem時,會遇到難以追查的錯誤。最終,我最終通過源代碼跟蹤對象並將所有內容都留在我的腦海中。是否有一種簡單的方法來記錄在Ruby對象上調用的方法?
但是能夠在對象上調用諸如#log_method_calls
之類的東西會很好,所以對其調用的所有方法都會打印到stdout或其他東西。有什麼辦法可以做到這一點?
有沒有一種快速的方法來跟蹤被調用的對象的方法?通常,當我在低於其公共界面的級別上使用gem時,會遇到難以追查的錯誤。最終,我最終通過源代碼跟蹤對象並將所有內容都留在我的腦海中。是否有一種簡單的方法來記錄在Ruby對象上調用的方法?
但是能夠在對象上調用諸如#log_method_calls
之類的東西會很好,所以對其調用的所有方法都會打印到stdout或其他東西。有什麼辦法可以做到這一點?
根據具體情況,有幾種方法可以做到這一點。
如果可以創建一個新對象而不是觀察對象,那麼可以使用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)
謝謝!兩個非常聰明和合理的解決方案第二種解決方案也激發了這樣一個想法,即通過'#log_method_calls'這樣的方法擴展'Object'類,該方法使用'Logger' mixin快速創建一個新類,以便您可以在應用程序中的任何位置執行此操作。 –
你可能想看看[紅寶石調試(http://bashdb.sourceforge.net/ruby-debug.html)。它有一點點的學習曲線,但考慮到你正在做的事情,它可能會更多地彌補它的時間節省。 – coreyward