Como posso largar o IRB de comandos a partir de um script em execução?
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.
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.