gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:21:16 25 4
gpt4 key购买 nike

如果我们调用 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 方法吗?

最佳答案

Kernel#caller 有一个替代方案,名为 Kernel#caller_locations , 返回 Thread::Backtrace::Location 的数组对象。根据手册,这些理论上应该能够通过#label给你这个信息。方法。

Returns the label of this frame.

Usually consists of method, class, module, etc names with decoration.

然而,在尝试之后,我需要质疑文档中的术语 usually ,因为它似乎仍然只返回方法名称。除非 usually 意味着它适合你,否则目前似乎没有办法实现这一点。

编辑:

根据评论,满足通常条件的一种情况是方法调用来自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>

关于ruby - 从堆栈中提取有关方法接收器的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33011604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com