set_trace_func
set_trace_funcを使ってProcオブジェクトを登録すると、インタプリタの動きにあわせてそのオブジェクトが呼び出されます。
set_trace_func proc { |event, file, line, id, binding, klass| print "#{event}, #{file}, #{line}, #{id}, #{binding}, #{klass}\n" } class Rubyco def self.singleton_method_added(sym) puts "singleton_method_added(#{sym})" end def self.singleton_method_removed(sym) puts "singleton_method_removed(#{sym})" end end
実行結果です。
line, a.rb, 5, , #<Binding:0x298e840>, false c-call, a.rb, 5, inherited, #<Binding:0x298e768>, Class c-return, a.rb, 5, inherited, #<Binding:0x298e648>, Class class, a.rb, 5, , #<Binding:0x298e510>, false line, a.rb, 6, , #<Binding:0x298e408>, false call, a.rb, 6, singleton_method_added, #<Binding:0x298e2d0>, Rubyco line, a.rb, 7, singleton_method_added, #<Binding:0x298e1c8>, Rubyco c-call, a.rb, 7, to_s, #<Binding:0x298e0c0>, Symbol c-return, a.rb, 7, to_s, #<Binding:0x298dfb8>, Symbol c-call, a.rb, 7, puts, #<Binding:0x298de98>, Kernel c-call, a.rb, 7, write, #<Binding:0x298df58>, IO singleton_method_added(singleton_method_added)c-return, a.rb, 7, write, #<Binding:0x298de50>, IO c-call, a.rb, 7, write, #<Binding:0x298dd60>, IO c-return, a.rb, 7, write, #<Binding:0x298dc40>, IO c-return, a.rb, 7, puts, #<Binding:0x298db38>, Kernel return, a.rb, 8, singleton_method_added, #<Binding:0x298da48>, Rubyco line, a.rb, 9, , #<Binding:0x298d958>, false call, a.rb, 6, singleton_method_added, #<Binding:0x298d670>, Rubyco line, a.rb, 7, singleton_method_added, #<Binding:0x298d580>, Rubyco c-call, a.rb, 7, to_s, #<Binding:0x298d460>, Symbol c-return, a.rb, 7, to_s, #<Binding:0x298d358>, Symbol c-call, a.rb, 7, puts, #<Binding:0x298d268>, Kernel c-call, a.rb, 7, write, #<Binding:0x298d2f8>, IO singleton_method_added(singleton_method_removed)c-return, a.rb, 7, write, #<Binding:0x298d208>, IO c-call, a.rb, 7, write, #<Binding:0x298d118>, IO c-return, a.rb, 7, write, #<Binding:0x298d028>, IO c-return, a.rb, 7, puts, #<Binding:0x298cf20>, Kernel return, a.rb, 8, singleton_method_added, #<Binding:0x298ce30>, Rubyco end, a.rb, 5, , , false
これを使うと、デバッガが作れそうですね♪……って、デバッガはこれを使って作っているのだそうです。