如何在 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>' 这可能是您需要的答案。它使用的方法涉及覆盖Classnew 方法来跟踪类***.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) ; endA.new.bar 导致 method_name #=> :bar 并返回 [A]。如果其他类有方法:bar,这些类将包含在A.new.bar 返回的数组中。如果您在家中尝试此操作,则需要取消上面的反引号。 (我逃脱了它,所以它可以被看到。) 【参考方案1】:

为了得到整个堆栈,我通常会这样做:

caller.select |x| x.include?("my_string") 

my_string 是我的项目的名称

【讨论】:

以上是关于如何在 ruby​​ 中找到调用者类?的主要内容,如果未能解决你的问题,请参考以下文章

ruby 打印调用者以进行查询

Ruby调用者实验

你如何找到调用者函数? [复制]

如何知道调用者类 C# [重复]

如何使用堆栈跟踪或反射找到方法的调用者?

FxCop,组成依赖程序集的调用者列表