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

wgx48brx  于 2023-04-05  发布在  Ruby
关注(0)|答案(8)|浏览(160)

在Ruby中有没有一种方法可以在方法中找到调用方法的名称?
例如:

class Test
  def self.foo
    Fooz.bar
  end
end

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

vjhs03f71#

puts caller[0]

或者...

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

bwitn5fc2#

在Ruby 2.0.0中,你可以用途:

caller_locations(1,1)[0].label

它比Ruby 1.8+解决方案快得多:

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

当我得到时间(或一个pull请求!)时,将包含在backports中。

ubby3x7f

ubby3x7f3#

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

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

lb3vh1jj

lb3vh1jj4#

我用

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

qyswt5oh5#

不如

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

更干净的海事组织。

dkqlctbz

dkqlctbz6#

相反,你可以把它写成库函数,在需要的地方调用它。代码如下:

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_method
code reference from

44u64gxh

44u64gxh7#

为了在任何语言中查看调用者和被调用者的信息,无论是ruby、java还是python,你总是希望查看堆栈跟踪。在一些语言中,如Rust和C++,编译器中内置了一些选项,可以打开某种可以在运行时查看的分析机制。我相信Ruby中存在一个名为ruby-prof的机制。
如上所述,你可以查看ruby的执行堆栈,这个执行堆栈是一个包含回溯位置对象的数组。
基本上,您需要了解的关于此命令的所有内容如下:
caller(start=1,length=nil)→ array或nil

kcwpcxri

kcwpcxri8#

来自@amitkarsale的答案是可行的,但是private在模块中不做任何事情,因为模块没有被示例化。下面是call_chain.rb,根据Rubocop的建议重写:

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

  def self.parse_caller(at)
    return unless /^(.+?):(\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

if __FILE__ == $PROGRAM_NAME
  caller = CallChain.caller_method
  puts caller
end

相关问题