Можно ли перейти к приглашению IRB из работающего Ruby script?
Я хочу запустить script, но затем дайте мне приглашение IRB в точке программы с текущим состоянием программы, но не просто запустив rdebug и получив точку останова.
Можно ли перейти к приглашению IRB из работающего Ruby script?
Я хочу запустить script, но затем дайте мне приглашение IRB в точке программы с текущим состоянием программы, но не просто запустив rdebug и получив точку останова.
вы можете использовать ruby-debug для доступа к irb
require 'rubygems'
require 'ruby-debug'
x = 23
puts "welcome"
debugger
puts "end"
когда программа достигает отладчика, вы получите доступ к irb.
Pry (альтернатива IRB) также позволяет вам это делать, на самом деле он был разработан с нуля именно для этого варианта использования:)
Это так же просто, как положить binding.pry
в точку, в которой вы хотите начать сеанс:
require 'pry'
x = 10
binding.pry
И внутри сеанса:
pry(main)> puts x
=> 10
Ознакомьтесь с веб-сайтом: http://pry.github.com
Позвольте вам:
edit obj.my_method
Более тонкие и оригинальные функции
по-видимому, требуется, чтобы фрагмент кода попадал в irb.
Здесь ссылка (кажется, работает хорошо).
http://jameskilton.com/2009/04/02/embedding-irb-into-your-ruby-application
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
Мне очень поздно в игре, но если вы уже загрузили script из irb/pry, простой raise
также поможет вам вернуться в приглашение irb/pry. Я использую это довольно часто при написании одного скрипта в консоли rails.