How to get the name of the calling method?

Ruby

Ruby Problem Overview


is there a way in Ruby to find the calling method name inside of a method?

For example:

class Test
  def self.foo
    Fooz.bar
  end
end

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

Ruby Solutions


Solution 1 - Ruby

puts caller[0]

or perhaps...

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

Solution 2 - Ruby

In Ruby 2.0.0, you can use:

caller_locations(1,1)[0].label

It's much faster than the Ruby 1.8+ solution:

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

Will get included in backports when I get the time (or a pull request!).

Solution 3 - Ruby

Use caller_locations(1,1)[0].label (for ruby >= 2.0)

Edit: My answer was saying to use __method__ but I was wrong, it returns the current method name.

Solution 4 - Ruby

I use

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

Solution 5 - Ruby

How about

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

Much cleaner imo.

Solution 6 - Ruby

Instead you can write it as library function and make a call wherever needed. The code goes as follows :

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

To trigger the above module method you need to call like this: caller = CallChain.caller_method

code reference from

Solution 7 - Ruby

In order to see the caller and callee information in any language, whether it be ruby or java or python, you would always want to look at the stack trace. In some languages, such as Rust and C++, there are options built into the compiler to turn on some sort of profiling mechanism you can view during run time. I do belive one exists for Ruby called ruby-prof.

And as mentioned above, you could look into the execution stack for ruby. This execution stack is an array containing backtrace location objects.

Essentially all you need to know about this command is as follows:

caller(start=1, length=nil) → array or nil

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjrichardlaiView Question on Stackoverflow
Solution 1 - RubyDigitalRossView Answer on Stackoverflow
Solution 2 - RubyMarc-André LafortuneView Answer on Stackoverflow
Solution 3 - RubyDorianView Answer on Stackoverflow
Solution 4 - RubyHéctor GarcíaView Answer on Stackoverflow
Solution 5 - Rubythrice801View Answer on Stackoverflow
Solution 6 - Rubyamit karsaleView Answer on Stackoverflow
Solution 7 - Rubyuser3769125View Answer on Stackoverflow