如何在 ruby 中找到调用者类?
Posted
技术标签:
【中文标题】如何在 ruby 中找到调用者类?【英文标题】:How to find the caller class in ruby? 【发布时间】:2020-10-03 01:34:37 【问题描述】:class A
def bar
B.new.foo
end
end
class B
def foo
#Here
"HELLO WORLD!"
end
end
A.new.bar
在B#foo
内,
我怎样才能找到class A
或任何其他参考或类名。
基本上是从哪个类调用的。
我尝试过这样的事情:
self.class
#B
self.class.superclass
#Object
【问题讨论】:
你试过caller.first
吗?
试过但它给了方法调用者 - /Users/vikas/Desktop/Test/friend.rb:31:in `bar'
caller.first - /Users/vikas/Desktop/Test/friend.rb:43:in `<main>'
这可能是您需要的答案。它使用的方法涉及覆盖Class
的new
方法来跟踪类***.com/questions/19679969/get-caller-class
好吧,可以通过定义foo
来缩小可能性:def foo; method_name = caller[0][/`\w+'/][1..-2].to_sym; ObjectSpace.each_object(Class).select |c| c.instance_methods.include?(method_name) ; end
。 A.new.bar
导致 method_name #=> :bar
并返回 [A]
。如果其他类有方法:bar
,这些类将包含在A.new.bar
返回的数组中。如果您在家中尝试此操作,则需要取消上面的反引号。 (我逃脱了它,所以它可以被看到。)
【参考方案1】:
为了得到整个堆栈,我通常会这样做:
caller.select |x| x.include?("my_string")
my_string
是我的项目的名称
【讨论】:
以上是关于如何在 ruby 中找到调用者类?的主要内容,如果未能解决你的问题,请参考以下文章