Ruby 如何获取调用方法的名称?

Ruby 如何获取调用方法的名称?,ruby,Ruby,在Ruby中,有没有一种方法可以在方法内部找到调用方法的名称 例如: class Test def self.foo Fooz.bar end end class Fooz def self.bar # get Test.foo or foo end end 或者也许 puts caller[0][/`.*'/][1..-2] 我用 在Ruby 2.0.0中,您可以使用: caller_locations(1,1)[0].label 它比Ruby 1.8+

在Ruby中,有没有一种方法可以在方法内部找到调用方法的名称

例如:

class Test
  def self.foo
    Fooz.bar
  end
end

class Fooz
  def self.bar
    # get Test.foo or foo
  end
end
或者也许

puts caller[0][/`.*'/][1..-2]
我用


在Ruby 2.0.0中,您可以使用:

caller_locations(1,1)[0].label
它比Ruby 1.8+解决方案更好:

caller[0][/`([^']*)'/, 1]
当我得到时间(或拉取请求!)时,将包含在
后端口中。

使用
调用方位置(1,1)[0]。标签
(对于ruby>=2.0)

编辑:我的回答是使用
\uuuuu方法
,但我错了,它返回了当前的方法名称。

怎么样

caller[0].split("`").pop.gsub("'", "")

更干净。

相反,您可以将其编写为库函数,并在需要时进行调用。守则如下:

module CallChain
  def self.caller_method(depth=1)
    parse_caller(caller(depth+1).first).last
  end

  private

  # Copied from ActionMailer
  def self.parse_caller(at)
    if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
      file   = Regexp.last_match[1]
      line   = Regexp.last_match[2].to_i
      method = Regexp.last_match[3]
      [file, line, method]
    end
  end
end
要触发上述模块方法,您需要如下调用:
caller=CallChain.caller\u方法


为了查看任何语言(无论是ruby、java还是python)中的调用者和被调用者信息,您总是希望查看堆栈跟踪。在某些语言中,如Rub和C++,编译器中有一些选项可以打开一些在运行时可以查看的剖析机制。我相信Ruby有一个叫做Ruby-prof的

如上所述,您可以查看ruby的执行堆栈。此执行堆栈是包含回溯位置对象的数组

基本上,关于此命令,您需要了解的内容如下:



调用者(开始=1,长度=nil)→ array或nil

是,请参阅Kernel#caller,即给出调用方法名称的aka,但它没有给出该方法属于哪个模块或类的任何指示。有可能吗?@thomtom是的,有可能您可以调用self.class.name来查看类名将正则表达式作为字符串索引的出色使用!还可以使用调用方[0][/`(.*)/,1]
这在Rails 5.2.1中似乎不起作用。在Rails控制器中,这将返回“make_lambda中的块”
。我想这只适用于Ruby。这比DigitalRoss的方法有什么优势?更干净、更精确。与其进行搜索,不如使用数组方法根据位置(可能不正确)分割不需要的字符。为什么不简单地使用调用者[0][/`(.*')/,1]?我不是正则表达式的专家,但它似乎很管用。@collimarco只要字符串中不包含超出您要查找的字符串(我认为它不能)的
,结果肯定是一样的。但是,
[^']*
将执行得更好,因为正则表达式引擎将在表达式到达
'
时停止尝试匹配该部分(您的版本将转到末尾,然后回溯,因为它在末尾没有找到
'
)。当然,在这种情况下,差别可以忽略不计,但尽可能避免在正则表达式中使用
。get调用对象可能重复:而不是“get The name of The current executed method in Ruby”(获取当前在Ruby中执行的方法的名称)的重复。这个问题询问调用方法的名称,不是当前方法的名称。@Oswaldofereira谢谢,在另一个答案中发现它是开的,这是不正确的,它返回当前方法,而不是调用当前方法的方法…效果很好。也似乎比2.0之前的方法快得多。一个指向潜在解决方案的链接总是受欢迎的,但是请让您的其他用户知道它是什么,以及它为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。考虑到仅仅是一个指向外部站点的链接是一个可能的原因。@XaviLópez已经更新了答案,如果我做错了或有什么错误,请纠正…thnx的善意建议:)感谢您改进了答案。不幸的是,我对Ruby没有足够的了解,无法对这篇文章发表适当的评论,但是现在答案看起来还不错。我已经取消了我的反对票。祝你好运:-)值得注意的是,这在Rubinius中是不可用的。如果你使用pry,你必须忽略pry stacktrace。似乎没有默认的解决方案。现在它似乎是
调用方位置[0].label
在Ruby 2.2.0上,否则您总是有
send\u action
result我们怎么能只得到call app方法而忽略框架调用?
caller[0].split("`").pop.gsub("'", "")
module CallChain
  def self.caller_method(depth=1)
    parse_caller(caller(depth+1).first).last
  end

  private

  # Copied from ActionMailer
  def self.parse_caller(at)
    if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
      file   = Regexp.last_match[1]
      line   = Regexp.last_match[2].to_i
      method = Regexp.last_match[3]
      [file, line, method]
    end
  end
end