Есть ли способ в Ruby найти имя вызывающего метода внутри метода?
Например:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
Есть ли способ в Ruby найти имя вызывающего метода внутри метода?
Например:
class Test
def self.foo
Fooz.bar
end
end
class Fooz
def self.bar
# get Test.foo or foo
end
end
puts caller[0]
или, возможно,...
puts caller[0][/`.*'/][1..-2]
В Ruby 2.0.0 вы можете использовать:
caller_locations(1,1)[0].label
Это намного быстрее, чем решение Ruby 1. 8+:
caller[0][/'([^']*)'/, 1]
Будут включены в backports
когда я получу время (или запрос на выдачу!).
Используйте caller_locations(1,1)[0].label
(для ruby> = 2.0)
Изменить: мой ответ говорил использовать __method__
но я был не прав, он возвращает имя текущего метода.
Я использую
caller[0][/`([^']*)'/, 1]
Как насчет
caller[0].split("`").pop.gsub("'", "")
Значительно чище имо.
Вместо этого вы можете записать его как функцию библиотеки и сделать звонок там, где это необходимо. Код выглядит следующим образом:
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
Чтобы видеть информацию о вызывающем и вызываемом абонентах на любом языке, будь то рубин или java или python, вы всегда хотели бы посмотреть на трассировку стека. На некоторых языках, таких как Rust и С++, есть встроенные в компилятор опции, чтобы включить какой-то механизм профилирования, который вы можете просмотреть во время выполнения. Я действительно верю, что существует Ruby, называемый ruby-prof.
И как уже упоминалось выше, вы можете посмотреть в стек исполнения для ruby. Этот исполняемый стек представляет собой массив, содержащий объекты местоположения backtrace.
По существу, все, что вам нужно знать об этой команде, выглядит следующим образом:
caller (start = 1, length = nil) → array или nil