2015-10-08 2 views
2

Если мы называем caller метод, мы получим что-то вроде:Извлечение информации о методе приемника из стека

prog.rb:3:in `a' 
prog.rb:6:in `b' 
prog.rb:9:in `c' 

Это полезно для людей, но если бы я хотел, чтобы проанализировать стек программно, а не действительно, как два метода :a может быть полностью несвязанным.

Есть ли способ/способ извлечь информацию о приемнике методов (например, его класс или идентификатор объекта)? Например:

prog.rb:3:in `Klass#a' 
prog.rb:6:in `Modoole#b' 
prog.rb:9:in `OtherKlass#c' 

Форматирование является лишь примером; эта информация может быть Array или что-то еще.

Я пытаюсь подражать этому с помощью TracePoint, но создание отдельного стека - плохое решение. Есть ли какой-либо способ Ruby, который я пропустил в документах?

ответ

1

Существует альтернатива Kernel#caller с именем Kernel#caller_locations, которая возвращает массив из Thread::Backtrace::Location объектов. Согласно руководству, они должны теоретически дать вам эту информацию с помощью метода #label.

Возвращает метку этой рамки.

Обычно состоит из имени метода, класса, модуля и т. Д. С отделкой.

Попробовав на это, однако, мне нужно ставить под сомнение термин обычно в документации, потому что, кажется, возвращает только имя метода до сих пор. Если обычно означает, что он работает на вас, похоже, пока нет способа выполнить это.

Edit:

Согласно комментарию, один случай, который удовлетворяет условию обычно когда вызов метода исходит изнутри Class или Module тела:

class A 
    def trace 
    puts caller_locations.first.label 
    end 
end 

class B 
    A.new.trace 
end 
#=> <class:B> 

module C 
    A.new.trace 
end 
#=> <module:C> 
+1

кажется _usually_ означает «когда код вызывается непосредственно из тела класса». – Borsunho

+0

Ницца найти @ Борсуньо. Я добавил его к ответу. Я посмотрю, смогу ли я спросить кого-нибудь об основной команде Ruby. – Drenmi

Смежные вопросы