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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top