Подтвердить что ты не робот

Как я могу перейти к приглашению IRB из работающего script?

Можно ли перейти к приглашению IRB из работающего Ruby script?

Я хочу запустить script, но затем дайте мне приглашение IRB в точке программы с текущим состоянием программы, но не просто запустив rdebug и получив точку останова.

4b9b3361

Ответ 1

вы можете использовать ruby-debug для доступа к irb

require 'rubygems'
require 'ruby-debug'
x = 23
puts "welcome"
debugger
puts "end"

когда программа достигает отладчика, вы получите доступ к irb.

Ответ 2

Pry (альтернатива IRB) также позволяет вам это делать, на самом деле он был разработан с нуля именно для этого варианта использования:)

Это так же просто, как положить binding.pry в точку, в которой вы хотите начать сеанс:

require 'pry'
x = 10
binding.pry

И внутри сеанса:

pry(main)> puts x
=> 10

Ознакомьтесь с веб-сайтом: http://pry.github.com

Позвольте вам:

  • перейдите в сеанс в любой точке вашего кода.
  • просмотреть исходный код метода
  • просмотреть документацию метода (не используя RI, поэтому вам не нужно его генерировать)
  • входить и выходить из разных контекстов
  • подсветка синтаксиса Интеграция
  • gist
  • просмотр и воспроизведение истории
  • открыть редакторы для редактирования методов с использованием синтаксиса edit obj.my_method

Более тонкие и оригинальные функции

Ответ 3

по-видимому, требуется, чтобы фрагмент кода попадал в 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

Ответ 4

Эта функция доступна в 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

Ответ 5

Просто добавьте эту строку туда, где вы хотите точку останова:

require 'ruby-debug';debugger

но я предлагаю использовать pry вместо irb, что очень удобно, вместо этого вставьте следующую строку:

require 'pry'; binding.pry

Ответ 6

Мне очень поздно в игре, но если вы уже загрузили script из irb/pry, простой raise также поможет вам вернуться в приглашение irb/pry. Я использую это довольно часто при написании одного скрипта в консоли rails.