ruby使用参数名称和参数获取调用者完整命名空间

时间:2017-07-26 13:40:39

标签: ruby

在调试ruby应用程序时,我感兴趣的是在每个函数中打印: - 完整方法命名空间 - 方法参数及其参数(值)

例如,给出以下代码块

public

在使用参数(例如module Foo module Bar def self.baz(p, q) end end end )调用baz时,应使用以下输出Foo::Bar.baz 'val1', 'val2'(或任何类似输出)打印消息

我熟悉ruby反射,所以我可以向每个函数介绍一些额外的代码来打印它。虽然,单点修改是一种幸福,因此每个方法调用另一种方法将产生这样的输出将是伟大的。

我的问题是:

  1. 无论如何都要引入一个方法,其他方法调用哪个方法会产生类似于上面的输出?

  2. 无论如何通过将打印方法(功能)绑定到任何其他方法的开头来实现相同的结果?

1 个答案:

答案 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方法中的不同。