TL; DR Вы можете попробовать использовать Kernel # caller .
Давайте рассмотрим файл с именем foo.rb
:
(в этом примере используется byebug
, но поток с binging.pry
почти такой же)
1: require 'byebug'
2:
3: def bar
4: byebug
5:
6: yield
7: end
8:
9: bar { 'some string' }
Когда мы запустим этот файл с ruby foo.rb
, мы остановимся на операторе byebug
.
[1, 9] in foo.rb
1: require 'byebug'
2:
3: def bar
4: byebug
5:
=> 6: yield
7: end
8:
9: bar { 'some string' }
Затем мы можем выполнить caller
, и будет напечатано что-то вроде следующего:
(выходные данные намеренно уменьшены и отформатированы)
(byebug) caller
[
"~/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/byebug-11.0.1/lib/byebug/processors/command_processor.rb:97:in `process_commands'",
"~/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/byebug-11.0.1/lib/byebug/processors/command_processor.rb:55:in `at_line'",
"~/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/byebug-11.0.1/lib/byebug/context.rb:98:in `at_line'",
"foo.rb:6:in `bar'",
"foo.rb:9:in `<main>'"
]
As Вы можете видеть, caller
возвращает текущий стек выполнения в виде массива, содержащего строки в форме file:line
в `method '.
Последняя строка в этом массиве указывает, где был вызван bar
.
Зная эту информацию, вы можете открыть файл с помощью этого bar
вызова и отследить, какой блок был передан в него.
(foo.rb:9
в данном конкретном случае)
Надеюсь, что помогает.
В качестве бонуса, есть замечательная статья Tenderlove - Я отладчик пута , wh Прежде чем вы найдете решение, вероятно, для каждой Ruby проблемы отладки.