如何获得调用方法的名称?

有没有办法在Ruby中find方法内的调用方法名称?

例如:

class Test def self.foo Fooz.bar end end class Fooz def self.bar # get Test.foo or foo end end 

7 Solutions collect form web for “如何获得调用方法的名称?”

 puts caller[0] 

也许…

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

在Ruby 2.0.0中,你可以使用:

 caller_locations(1,1)[0].label 

它比Ruby 1.8+解决scheme快得多 :

 caller[0][/`([^']*)'/, 1] 

当我得到时间(或拉请求!)将被包括在backports

我用

 caller[0][/`([^']*)'/, 1] 

使用caller_locations(1,1)[0].label对于ruby> = 2.0)

编辑 :我的答案是说使用__method__但我错了,它返回当前的方法名称,看到这个要点 。

怎么样

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

更清洁imo。

为了以任何语言查看调用者和被调用者的信息,无论是ruby还是java或python,总是需要查看堆栈跟踪。 在某些语言中,比如Rust和C ++,在编译器中内置了一些选项来打开某种在运行时可以查看的概要分析机制。 我相信ruby存在一个名为ruby-prof。

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

基本上所有你需要知道的这个命令如下:

调用者(start = 1,length = nil)→array或nil

相反,您可以将其编写为库函数,并在需要的地方拨打电话。 代码如下:

 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_methodcaller = CallChain.caller_method

代码参考

  • 如何比较Ruby中的版本?
  • 如何将哈希键从“符号”更改为“string”?
  • 将元素推到数组的开头的最简单的方法是什么?
  • 如何在Rails中明确指定模型的表名映射?
  • 在Ruby中使用范围填充数组的正确方法
  • 在Ruby中修改string而不创build新string的规范方法是什么?
  • “render:nothing => true”返回空的纯文本文件?
  • 如何通过Rack提供静态文件?
  • 如何在我的课堂上使用Enumerable mixin?
  • Rails 3:yield / content_for有一些默认值?
  • 为什么Ruby比Python更适合Rails?