2011-10-11 35 views
0

我使用jruby来运行一堆ruby脚本,虽然我使用它的纯红宝石部分。从红宝石方法进入 - 出

它有时很难从输出中看到究竟发生了什么,或者哪里发生了错误。

我希望得到这样的事情在我的STD出每个方法: 的方法输入一个 出方法的

现在我可以肯定去,把这些意见在每..这感觉非常的方法错误。有没有办法让ruby稍微详细一些,以便在日志中获取这些信息。希望我会避免使用大量的宝石等。因为这些是在一些托管服务器上,我将不得不花费一些时间来获得更多的S/F。希望有什么可以利用作为jruby本身的一部分

谢谢!

回答

0

您可以使用此代码:

module InOutHook 
    module ClassMethods 
    def setup_hooks(*syms) 
     syms.each do |sym| # For each symbol 
     str_id = "__#{sym}__hooked__" 
     unless private_instance_methods.include?(str_id) 
      alias_method str_id, sym  # Backup original method 
      private str_id     # Make backup private 
      define_method sym do |*args| # Replace method 
      puts ">>> #{self.class}\##{sym} >>>" 
      ret = __send__ str_id, *args # Invoke backup 
      puts "<<< #{self.class}\##{sym} >>>" 
      ret 
      end 
     end 
     end 
    end 
    end 
    def InOutHook.included(base) 
    base.extend(ClassMethods) 
    end 
end 

class TestClass 
    def test1 
    puts "test!" 
    end 
    def test2(v) 
    puts "Value is #{v}" 
    end 
    include InOutHook 
    setup_hooks(:test1, :test2) 
end 

# works on existing classes too: 
class Array 
    include InOutHook 
    setup_hooks(:[]) 
end 

tc = TestClass.new 
tc.test1 
tc.test2(10) 

ary = [1,2,3] 
puts ary[1..2] 

如果你想叱添加到方法,只需添加一个图示星号:

setup_hooks(*[].methods) 
+0

日Thnx!有没有办法让班级中的所有方法,而不是列出它们。我尝试使用setup_hooks([]。methods.grep/^ re /)..但结果是:TypeError:[“reject”,“reverse!”,“reverse_each”,“reverse”,“replace”,“reject! “,”reduce“,”respond_to?“]不是字符串 – codeObserver

+0

你只需要添加一个前导splat星号,看看我上面的编辑(它也适用于你的正则表达式)。 – p4010