В 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]
caller[0][/`(.*)'/,1]
"block in make_lambda"
. Я думаю, это только для Ruby.
В Ruby 2.0.0 вы можете использовать:
caller_locations(1,1)[0].label
Это намного быстрее, чем решение Ruby 1.8+:
caller[0][/`([^']*)'/, 1]
Будут включены, backports
когда я получу время (или запрос тянуть!).
caller_locations[0].label
на Ruby 2.2.0, иначе у вас всегда будет send_action
результат
Использовать caller_locations(1,1)[0].label
(для ruby> = 2.0)
Изменить : мой ответ говорил, чтобы использовать, __method__
но я был не прав, он возвращает имя текущего метода.
я использую
caller[0][/`([^']*)'/, 1]
'
кроме того, что вы ищете (и я полагаю, что не может), результат будет таким же, конечно. Тем не менее, он [^']*
будет работать лучше, так как движок регулярных выражений перестанет пытаться сопоставить эту часть выражения с моментом, когда он достигнет '
(ваша версия будет идти до конца, а затем возвращаться назад, потому что она не нашла '
в конце). Конечно, в этом случае разница довольно незначительна, но по возможности следует избегать .
регулярных выражений.
Вместо этого вы можете написать его как библиотечную функцию и сделать вызов там, где это необходимо. Код выглядит следующим образом:
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
Чтобы увидеть информацию о вызывающем и вызываемом абонентах на любом языке, будь то ruby, java или python, вы всегда должны смотреть на трассировку стека. В некоторых языках, таких как Rust и C ++, в компилятор встроены опции для включения какого-либо механизма профилирования, который вы можете просматривать во время выполнения. Я верю, что существует одна для Ruby, которая называется ruby-prof.
И, как упоминалось выше, вы можете заглянуть в стек выполнения для ruby. Этот стек выполнения представляет собой массив, содержащий объекты местоположения обратной трассировки.
По сути, все, что вам нужно знать об этой команде, заключается в следующем:
вызывающая сторона (начало = 1, длина = ноль) → массив или ноль