Как получить имя вызывающего метода?

Есть ли способ в Ruby найти имя вызывающего метода внутри метода?

Например:

class Test
  def self.foo
    Fooz.bar
  end
end

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

Ответ 1

puts caller[0]

или, возможно,...

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

Ответ 2

В Ruby 2.0.0 вы можете использовать:

caller_locations(1,1)[0].label

Это намного быстрее, чем решение Ruby 1. 8+:

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

Будут включены в backports когда я получу время (или запрос на выдачу!).

Ответ 3

Используйте caller_locations(1,1)[0].label (для ruby> = 2.0)

Изменить: мой ответ говорил использовать __method__ но я был не прав, он возвращает имя текущего метода.

Ответ 4

Я использую

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

Ответ 5

Как насчет

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

Значительно чище имо.

Ответ 6

Вместо этого вы можете записать его как функцию библиотеки и сделать звонок там, где это необходимо. Код выглядит следующим образом:

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

ссылка на код из

Ответ 7

Чтобы видеть информацию о вызывающем и вызываемом абонентах на любом языке, будь то рубин или java или python, вы всегда хотели бы посмотреть на трассировку стека. На некоторых языках, таких как Rust и С++, есть встроенные в компилятор опции, чтобы включить какой-то механизм профилирования, который вы можете просмотреть во время выполнения. Я действительно верю, что существует Ruby, называемый ruby-prof.

И как уже упоминалось выше, вы можете посмотреть в стек исполнения для ruby. Этот исполняемый стек представляет собой массив, содержащий объекты местоположения backtrace.

По существу, все, что вам нужно знать об этой команде, выглядит следующим образом:

caller (start = 1, length = nil) → array или nil