Como posso largar o IRB de comandos a partir de um script em execução?

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

  •  16-09-2019
  •  | 
  •  

Pergunta

Posso cair para uma IRB de comandos a partir de uma execução do script Ruby?

Eu quero executar um script, mas, em seguida, ter que me dar uma IRB prompt em um ponto no programa, com o estado atual do programa, mas não apenas pela execução rdebug e ter um ponto de interrupção.

Foi útil?

Solução

Você pode usar o Ruby-debug para obter acesso ao IRB

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

Quando o programa chegar ao depurador, você terá acesso ao IRB.

Outras dicas

Alavanca (Uma alternativa do IRB) também permite que você faça isso, na verdade, foi projetado desde o início para exatamente este caso de uso :)

É tão fácil quanto colocar binding.pry No momento, você deseja iniciar a sessão:

require 'pry'
x = 10
binding.pry

E dentro da sessão:

pry(main)> puts x
=> 10

Confira o site: http://pry.github.com

Aproveite você:

  • Entre em uma sessão em qualquer ponto do seu código
  • Visualizar o código -fonte do método
  • Visualizar documentação do método (não usando o RI para que você não precise pré-generá-lo)
  • entrar e sair de diferentes contextos
  • realce de sintaxe
  • Integração da GIST
  • Visualizar e reproduzir histórico
  • editores abertos para editar métodos usando edit obj.my_method sintaxe

Uma tonelada mais ótimos e originais recursos

Aparentemente, requer um pedaço de código para cair no IRB.

Aqui está o link (parece funcionar bem).

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

Este recurso está disponível a partir de Ruby 2.4.Você pode usar apenas binding.irb

E. g.

require 'irb'
a = 10
binding.irb
puts a

Se você executar o código acima, você terá irb console, de modo que você pode verificar valores de variáveis locais e qualquer outra coisa que esteja no escopo.

Fonte: http://blog.redpanthers.co/new-binding-irb-introduced-ruby-2-4/

Ruby commit: https://github.com/ruby/ruby/commit/493e48897421d176a8faf0f0820323d79ecdf94a

Basta adicionar esta linha a onde você deseja o ponto de interrupção:

require 'ruby-debug';debugger

Mas sugiro usar Pry em vez de IRB, que é super útil, insira a seguinte linha:

require 'pry'; binding.pry

Estou muito atrasado para o jogo, mas se você está carregando um script de dentro do IRB/PRY raise Também trabalha para retirá -lo para o prompt IRB/Pry. Eu uso isso com bastante frequência ao escrever um scripts dentro do console do Rails.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top