【问题标题】:Getting the name of the defined method获取已定义方法的名称
【发布时间】:2012-10-07 09:42:13
【问题描述】:

我知道我可以使用set_trace_func 来捕捉方法定义的瞬间。

set_trace_func ->event, file, line, method, binding, klass{
  if event == "c-call" and method == :method_added
    # The moment of method definition
  end
}
  1. 是否可以捕获此时定义的方法的名称?我知道这个类可以被eval("self", binding)捕获。我可以在上面显示的块中放入什么代码来捕获方法名称?
  2. 是否可以进一步获取正在定义的方法的参数格式(所需参数、其余参数以及它们在源代码中的名称)?

【问题讨论】:

    标签: ruby metaprogramming


    【解决方案1】:

    set_trace_func之外,你可以使用Module.method_added

    class Test
      def self.method_added(method_name)
        puts "#{method_name} added to #{self}"
      end
    
      def foo
        "foo"
      end
    end
    
    $ ruby test.rb
    # => foo added to Test
    

    【讨论】:

    【解决方案2】:

    检查文档。

    Kernel.set_trace_func 过程允许您捕获 id 参数。这——大多数时候——是函数名。

    但是,从您的示例中学习,您还可以使用 eval("__method__", binding) 获取当前运行的方法……但我认为这只会获取您在类中定义的方法。

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2020-09-03
      • 2023-02-07
      • 2022-08-22
      相关资源
      最近更新 更多