首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Ruby的TracePoint获取方法参数

使用Ruby的TracePoint获取方法参数
EN

Stack Overflow用户
提问于 2015-06-01 22:36:59
回答 1查看 1.3K关注 0票数 7

我可以使用TracePoint API访问Ruby的参数:

代码语言:javascript
复制
def foo(foo_arg)
end

trace = TracePoint.trace(:call, :c_call) do |tp|
  tp.disable
  case tp.method_id
  when :foo, :sub
    method = eval("method(:#{tp.method_id})", tp.binding)
    method.parameters.each do |p|
      puts "#{p.last}: #{tp.binding.local_variable_get(p.last)}"
    end
  end
  tp.enable
end

trace.enable

foo(10)
# => foo_arg: 10

但是,当我用一个c方法调用来尝试时,我会得到一个错误。

代码语言:javascript
复制
"foo".sub(/(f)/) { $1.upcase }
script.rb:20:in `method': undefined method `sub' for class `Object' (NameError)
    from script.rb:20:in `<main>'
    from script.rb:8:in `eval'
    from script.rb:8:in `block in <main>'
    from script.rb:20:in `<main>'

这看起来是因为在使用C方法调用和常规Ruby方法调用时返回的绑定之间存在差异。

在Ruby中,tp.self等于tp.binding.eval("self")main,而在C情况下,tp.self"foo"tp.binding.eval("self")main。是否有方法将参数传递给使用TracePoint和C定义方法的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-02 09:21:45

正如您在问题中指出的以及在ruby文档中记录的那样,tp.self返回一个跟踪对象,该对象具有您正在寻找的method方法。我觉得你应该用

method = tp.self.method(tp.method_id)

而不是

method = eval("method(:#{tp.method_id})", tp.binding)

更新.关于你最后一段的一些解释。tp.self在第一种情况下(当您调用foo时)指向main,因为您在主上下文中定义了foo方法,而在第二种情况下,它指向String对象,因为在那里定义了sub。但是tp.binding.eval("self")在这两种情况下都返回main,因为它返回一个调用上下文(不是您预期的“定义”上下文),在这两种情况下它都是main

更新(回复评论)我认为唯一的方法是猴子补丁、sub和所有其他您感兴趣的方法。代码示例:

代码语言:javascript
复制
class String
  alias_method :old_sub, :sub
  def sub(*args, &block)
    old_sub(*args, &block)
  end
end

trace = TracePoint.trace(:call, :c_call) do |tp|
  tp.disable
  case tp.method_id
  when :sub
    method = tp.self.method(tp.method_id)
    puts method.parameters.inspect
  end
  tp.enable
end

trace.enable

"foo".sub(/(f)/) { |s| s.upcase }

一个很大的缺点是您不能在原始块中使用$1, $2, ... vars。正如所指出的,这里哪里没有办法使它工作。但是,您仍然可以使用块参数(在我的示例中是s)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30584454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档