Как мне дойти до подсказки IRB из работающего сценария?

StackOverflow https://stackoverflow.com/questions/1144560

  •  16-09-2019
  •  | 
  •  

Вопрос

Могу ли я упасть в подсказку 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top