43 Stimmen

Wie kann ich aus einem laufenden Skript zur IRB-Eingabeaufforderung wechseln?

Kann ich aus einem laufenden Ruby-Skript zu einer IRB-Eingabeaufforderung wechseln?

Ich möchte ein Skript ausführen, aber dann eine IRB-Eingabeaufforderung an einem Punkt im Programm mit dem aktuellen Status des Programms erhalten, aber nicht nur durch Ausführen von rdebug und einen Haltepunkt.

46voto

horseyguy Punkte 28632

Pry (eine IRB-Alternative) ermöglicht dies ebenfalls, denn es wurde von Grund auf für genau diesen Anwendungsfall entwickelt :)

Es ist so einfach wie das Einlegen von binding.pry an dem Punkt, an dem Sie die Sitzung starten möchten:

require 'pry'
x = 10
binding.pry

Und innerhalb der Sitzung:

pry(main)> puts x
=> 10

Besuchen Sie die Website: http://pry.github.com

Pry lässt dich gewähren:

  • an jeder beliebigen Stelle in Ihrem Code in eine Sitzung einsteigen
  • Quellcode der Methode anzeigen
  • Dokumentation der Ansichtsmethode (ohne RI, so dass Sie sie nicht vorab generieren müssen)
  • in verschiedenen Kontexten auftauchen und wieder verschwinden
  • Syntaxhervorhebung
  • Gist-Einbindung
  • Historie ansehen und wiedergeben
  • offene Editoren zur Bearbeitung von Methoden mit edit obj.my_method Syntax

Eine Menge weiterer großartiger und origineller Funktionen

29voto

Subba Rao Punkte 9996

Sie können ruby-debug verwenden, um Zugang zu irb zu erhalten

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

Wenn das Programm den Debugger erreicht, erhalten Sie Zugang zu irb.

14voto

rogerdpack Punkte 55995

Offenbar ist es erforderlich, einen Teil des Codes in irb einzufügen.

Hier ist der Link (scheint gut zu funktionieren).

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

13voto

Tachyons Punkte 2065

Diese Funktion ist ab Ruby 2.4 verfügbar. Sie können einfach verwenden binding.irb

z.B.

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

Wenn Sie den obigen Code ausführen, erhalten Sie die irb-Konsole, so dass Sie die Werte der lokalen Variablen und alles andere, was in den Geltungsbereich fällt, überprüfen können.

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

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

0voto

Yuming Cao Punkte 885

Fügen Sie einfach diese Zeile an der Stelle ein, an der Sie den Haltepunkt setzen wollen:

require 'ruby-debug';debugger

aber ich schlage vor, pry anstelle von irb zu verwenden, was sehr praktisch ist, und stattdessen die folgende Zeile einzufügen:

require 'pry'; binding.pry

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X