Is it possible to run code after each line in Ruby?

前端 未结 3 820
攒了一身酷
攒了一身酷 2020-12-19 16:56

I understand that it is possible to decorate methods with before and after hooks in ruby, but is it possible to do it for each line of a given method?

For example, I

3条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-19 17:05

    It sounds like you want tracing on every method call on every object, but only during the span of every call to one particular method. In that case, you could just redefine the method to turn on- and off instrumentation. First, use the universal instrumentation suggsted in Pinochle's answer, then redefine the method in question as follows:

    # original definition, in /lib/foo.rb:
    class Foo
      def bar(baz)
        do_stuff
      end
    end
    
    # redefinition, in /test/add_instrumentation_to_foo.rb:
    Foo.class_eval do
      original_bar = instance_method(:bar)
      def bar(baz)
        TracedObject.install!
        original_bar.bind(self).call(baz)
        TracedObject.uninstall!
      end
    end
    

    You'd need to write the install! and uninstall methods, but they should be pretty trivial: just set or unset a class variable and check for it in the instrumentation logic.

提交回复
热议问题