Как получить имя вызывающего метода? - PullRequest
143 голосов
/ 24 февраля 2011

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

Например:

class Test
  def self.foo
    Fooz.bar
  end
end

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

Ответы [ 7 ]

191 голосов
/ 24 февраля 2011
puts caller[0]

или, может быть ...

puts caller[0][/`.*'/][1..-2]
152 голосов
/ 27 февраля 2013

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

caller_locations(1,1)[0].label

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

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

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

27 голосов
/ 17 января 2014

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

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

20 голосов
/ 19 июня 2012

Я использую

caller[0][/`([^']*)'/, 1]
4 голосов
/ 10 апреля 2014

Как насчет

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

намного чище имо.

3 голосов
/ 29 апреля 2014

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

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

код ссылки от

2 голосов
/ 24 июня 2014

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

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

По сути, все, что вам нужно знать об этой команде, таково:

вызывающий абонент (начало = 1, длина = ноль) → массив или ноль

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...