Ruby 从堆栈中提取有关方法接收器的信息
如果调用Ruby 从堆栈中提取有关方法接收器的信息,ruby,stack-trace,trace,Ruby,Stack Trace,Trace,如果调用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' 格式只是一个
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'
格式只是一个例子;此信息可能是数组
或任何内容
我试图用
TracePoint
来模拟这一点,但是形成一个单独的堆栈是一个糟糕的解决方案。文档中有没有我错过的Ruby方式?除了Kernel#caller
named之外,还有一种方法可以返回一个对象数组。根据手册,理论上,这些应该能够通过该方法为您提供这些信息
返回此帧的标签
通常由带有装饰的方法、类、模块等名称组成
但是,在尝试了这一点之后,我需要对文档中的术语提出疑问,因为它似乎仍然只返回方法名。除非通常意味着它对你有用,否则到目前为止似乎没有办法做到这一点
编辑:
根据注释,满足条件的一种情况通常是当方法调用来自类
或模块
主体时:
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>
A类
def跟踪
将调用者位置放在第一位
结束
结束
B类
A.新的
结束
#=>
模块C
A.新的
结束
#=>
它似乎通常意味着“当直接从类主体调用代码时”。很好的find@Borsunho。我已经把它添加到了答案中。我会看看是否可以向Ruby core团队的人询问这件事。