Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从堆栈中提取有关方法接收器的信息_Ruby_Stack Trace_Trace - Fatal编程技术网

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团队的人询问这件事。