从堆栈中提取有关方法接收器的信息

时间:2015-10-08 09:21:28

标签: ruby stack-trace tracing

如果我们调用caller方法,我们会得到类似的内容:

prog.rb:3:in `a'
prog.rb:6:in `b'
prog.rb:9:in `c'

这对人类很有帮助,但如果我想以编程方式分析堆栈,而不是真的,因为两个名为:a的方法可能完全不相关。

是否有任何方法/方法来提取有关方法接收者的信息(如类或对象ID)?例如:

prog.rb:3:in `Klass#a'
prog.rb:6:in `Modoole#b'
prog.rb:9:in `OtherKlass#c'

格式化只是一个例子;此信息可能是Array或其他任何内容。

我试图用TracePoint模仿这个,但是形成一个单独的堆栈是一个糟糕的解决方案。我在文档中遗漏了Ruby方法吗?

1 个答案:

答案 0 :(得分:1)

可以替代名为Kernel#caller_locationsKernel#caller,它返回Thread::Backtrace::Location个对象的数组。根据手册,这些理论上应该能够通过#label方法为您提供这些信息。

  

返回此框架的标签。

     

通常由带有装饰的方法,类,模块等组成。

然而,在尝试了这个之后,我需要在文档中质疑术语通常,因为它似乎只返回方法名称。除非通常意味着它适合你,否则目前似乎无法实现这一目标。

修改

根据评论,一个满足通常条件的情况是方法调用来自ClassModule正文:

class A
  def trace
    puts caller_locations.first.label
  end
end

class B
  A.new.trace
end
#=> <class:B>

module C
  A.new.trace
end
#=> <module:C>