Come faccio a cadere al prompt IRB da uno script in esecuzione?
Domanda
Posso scendere a un prompt IRB da uno script di Ruby in esecuzione?
voglio eseguire uno script, ma poi mi dà un prompt IRB in un punto del programma con lo stato attuale del programma, ma non solo eseguendo rdebug e avere un punto di interruzione.
Soluzione
è possibile utilizzare ruby-debug per avere accesso a IRB
require 'rubygems'
require 'ruby-debug'
x = 23
puts "welcome"
debugger
puts "end"
quando il programma raggiunge debugger si otterrà l'accesso a IRB.
Altri suggerimenti
leva (in alternativa IRB) consente anche di fare questo, in realtà è stato progettato da zero per esattamente questo caso d'uso:)
E 'facile come mettere binding.pry
nel punto che si desidera avviare la sessione:
require 'pry'
x = 10
binding.pry
E dentro la sessione:
pry(main)> puts x
=> 10
Controllate il sito web: http://pry.github.com
Fare leva ti permette di:
- cadere in una sessione in qualsiasi punto nel codice
- il codice sorgente di vista metodo
- metodo di visualizzazione della documentazione (se non utilizzano RI modo da non dovete pre-generarlo)
- pop dentro e fuori di contesti diversi
- l'evidenziazione della sintassi
- integrazione succo
- vista e la storia di replay
- editor aperti per modificare i metodi che utilizzano la sintassi
edit obj.my_method
Una tonnellata di più grandi e originali caratteristiche
a quanto pare si richiede un pezzo di codice per cadere in IRB.
Ecco il link (sembra funzionare bene).
http://jameskilton.com/2009 / 04/02 / embedding-IRB-in-your-ruby-applicazione
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
Questa funzione è disponibile da Ruby 2.4. Si può semplicemente utilizzare binding.irb
per es.
require 'irb'
a = 10
binding.irb
puts a
Se si esegue il codice di cui sopra, si otterrà console irb, in modo da poter controllare i valori delle variabili locali e qualsiasi altra cosa che è di portata.
Fonte: http://blog.redpanthers.co / new-binding-IRB-introdotto-ruby-2-4 /
Rubino commettere: https://github.com/ruby/ruby/commit/493e48897421d176a8faf0f0820323d79ecdf94a
Basta aggiungere questa riga al punto in cui si desidera che il punto di interruzione:
require 'ruby-debug';debugger
ma io suggerisco l'uso di leva invece di IRB, che è super a portata di mano, inserire la riga seguente invece:
require 'pry'; binding.pry
Sono abbastanza tardi per il gioco, ma se si sta caricando un copione da dentro IRB / PRY già, un semplice raise
funziona anche al pop si torna fuori al prompt / leva IRB. Io uso questo molto spesso durante la scrittura di una tantum script all'interno della console rotaie.