在调试ruby应用程序时,我感兴趣的是在每个函数中打印: - 完整方法命名空间 - 方法参数及其参数(值)
例如,给出以下代码块
public
在使用参数(例如module Foo
module Bar
def self.baz(p, q)
end
end
end
)调用baz
时,应使用以下输出Foo::Bar.baz 'val1', 'val2'
(或任何类似输出)打印消息
我熟悉ruby反射,所以我可以向每个函数介绍一些额外的代码来打印它。虽然,单点修改是一种幸福,因此每个方法调用另一种方法将产生这样的输出将是伟大的。
我的问题是:
无论如何都要引入一个方法,其他方法调用哪个方法会产生类似于上面的输出?
无论如何通过将打印方法(功能)绑定到任何其他方法的开头来实现相同的结果?
答案 0 :(得分:1)
您正在寻找的是#set_trace_func
结合内省:
module Foo
module Bar
def self.baz(p, q)
end
end
end
intercept_event = proc do |event, _, _, method_name, method_binding, _|
if event == 'call'
self_in_method = method_binding.eval('self')
parameter_names = self_in_method.method(method_name).parameters.map(&:last)
parameter_list = parameter_names.map do |name|
"#{name}=#{method_binding.local_variable_get(name)}"
end
puts "#{self_in_method}.#{method_name}(#{parameter_list.join ', '})"
end
end
set_trace_func intercept_event
Foo::Bar.baz 'val1', 'val2' # Foo::Bar.baz(p=val1, q=val2)
注意,这对C方法无效。要处理它们,您可以检查'c-call'
而不是'call'
。您必须在字符串eval
中移动方法参数,但这些方法中的self
与Ruby方法中的不同。