Как мне дойти до подсказки IRB из работающего сценария?
Вопрос
Могу ли я упасть в подсказку IRB из бегущего сценария Ruby?
Я хочу запустить сценарий, но затем попросил его дать мне подсказку IRB в точке программы с текущим состоянием программы, но не только запустив RDEBUG и имея точку останова.
Решение
Вы можете использовать Ruby-Debug, чтобы получить доступ к IRB
require 'rubygems'
require 'ruby-debug'
x = 23
puts "welcome"
debugger
puts "end"
Когда программа достигнет отладчика, вы получите доступ к IRB.
Другие советы
Призвать (Альтернатива IRB) также позволяет вам сделать это, на самом деле она была разработана с нуля именно для этого варианта использования :)
Это так же просто, как положить binding.pry
В тот момент вы хотите начать сеанс:
require 'pry'
x = 10
binding.pry
И внутри сеанса:
pry(main)> puts x
=> 10
Проверьте веб -сайт: http://pry.github.com
Прай, пусть ты:
- Зайдите в сеанс в любой момент вашего кода
- Просмотреть метод исходный код
- Просмотр документации по методу (не используя RI, поэтому вам не нужно предварительно генерировать его)
- входить и из разных контекстов
- Синтаксис выделение
- Интеграция GIST
- Просмотр и воспроизведения истории
- Откройте редакторы для редактирования методов с использованием
edit obj.my_method
синтаксис
Тонн более отличные и оригинальные функции
Видимо, требуется кусок кода, чтобы упасть в IRB.
Вот ссылка (кажется, хорошо работает).
http://jameskilton.com/2009/04/02/embedding-irb-into-your-ruby-pplication
require 'irb'
module IRB
def self.start_session(binding) # call this method to drop into irb
unless @__initialized
args = ARGV
ARGV.replace(ARGV.dup)
IRB.setup(nil)
ARGV.replace(args)
@__initialized = true
end
workspace = WorkSpace.new(binding)
irb = Irb.new(workspace)
@CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
@CONF[:MAIN_CONTEXT] = irb.context
catch(:IRB_EXIT) do
irb.eval_input
end
end
end
Эта функция доступна от Ruby 2.4. Вы можете просто использовать binding.irb
Например
require 'irb'
a = 10
binding.irb
puts a
Если вы запустите код выше, вы получите консоль IRB, чтобы вы могли осмотреть значения локальных переменных и все, что есть в сфере.
Источник: http://blog.redpanthers.co/new-binding-irb-introduced-ruby-2-4/
Ruby Commit: https://github.com/ruby/ruby/commit/493e48897421d176a8faf0f0820323d79ecdf94a
Просто добавьте эту строку туда, где вы хотите, чтобы точка останова:
require 'ruby-debug';debugger
Но я предлагаю использовать PRY вместо IRB, который очень удобен, вместо этого вставьте следующую строку:
require 'pry'; binding.pry
Я довольно опоздал на игру, но если вы уже загружаете сценарий из IRB/PRY, простой raise
Также работает, чтобы вывести вас обратно в подсказку IRB/PRY. Я использую это довольно часто при написании одного из сценариев в консоли Rails.