July 07, 2006Ruby Debug Injection[Computer]
Rubyでプログラムをよく書くのですが、メソッドの入出力を監視したい、つまりメソッドの引数と返り値が何であるか知りたくなることがあります。 module Debugger
使い方としてはdef debug(target_method, do_debug = true) if target_method.class != Symbol then target_method = target_method.intern end target_orig = "#{target_method}_orig".intern unless self.instance_methods.include?(target_orig.to_s) then self.instance_eval{ alias_method(target_orig, target_method) } end target_debug = "#{target_method}_debug".intern unless self.instance_methods.include?(target_debug.to_s) then self.module_eval(<<-__EVAL_STRING__) def #{target_debug}(*params) params.each_with_index{|param, i| puts 'INPUT' + i.to_s + ': ' + param.inspect } output = #{target_orig}(*params) puts 'OUTPUT: ' + output.inspect return output end __EVAL_STRING__ end self.instance_eval{ alias_method(target_method, do_debug ? target_debug : target_orig) } end end class Target
def a(b, c=nil) puts "ARG0: #{b}" puts "ARG1: #{c}" return c end end class Target Target::new.a(1) # normal Target::debug(:a) #attach debugger to method :a Target::debug(:a, false) #detach debugger from method :a スクリプト言語だから当たり前といってしまえばそれまでですが、Rubyはリフレクションの機能が強力なので怪しげなことが簡単にできてしまって楽しいです。でも、リフレクションを使いまくると明らかにコードが読みにくくなり、他の人に迷惑がかかるので注意したほうがいいかもしれません。ちなみに僕はリフレクションは好きな方なので、チームで開発した際に他のメンバーに迷惑をかけた記憶があります(笑)。 コメント
コメントする
|
スポンサード リンク
|