如果我们调用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方法吗?
答案 0 :(得分:1)
可以替代名为Kernel#caller_locations
的Kernel#caller
,它返回Thread::Backtrace::Location
个对象的数组。根据手册,这些理论上应该能够通过#label
方法为您提供这些信息。
返回此框架的标签。
通常由带有装饰的方法,类,模块等组成。
然而,在尝试了这个之后,我需要在文档中质疑术语通常,因为它似乎只返回方法名称。除非通常意味着它适合你,否则目前似乎无法实现这一目标。
修改强>
根据评论,一个满足通常条件的情况是方法调用来自Class
或Module
正文:
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>