Wie lasse ich die IRB -Eingabeaufforderung eines laufenden Skripts aus?
Frage
Kann ich eine IRB -Eingabeaufforderung von einem raufenden Ruby -Skript ausgeben?
Ich möchte ein Skript ausführen, aber dann geben Sie mir eine IRB -Eingabeaufforderung an einem Punkt im Programm mit dem aktuellen Status des Programms, aber nicht nur durch Ausführen von RDEBUG und einen Haltepunkt.
Lösung
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 Debugger erreicht, erhalten Sie Zugriff auf IRB.
Andere Tipps
Neugierig sein (Eine IRB -Alternative) Ermöglicht Sie dies auch, tatsächlich wurde sie von Grund auf diesen Anwendungsfall entworfen :)
Es ist so einfach wie das Putschen binding.pry
An dem Punkt möchten Sie mit der Sitzung beginnen:
require 'pry'
x = 10
binding.pry
Und innerhalb der Sitzung:
pry(main)> puts x
=> 10
Schauen Sie sich die Website an: http://pry.github.com
Pry lasst uns:
- Gehen Sie zu jedem Zeitpunkt in Ihrem Code in eine Sitzung ein
- Methodenquellcode anzeigen
- Dokumentation der Methode anzeigen (nicht mit RI, damit Sie sie nicht vorgenerieren müssen)
- In und aus verschiedenen Kontexten ein- und aussteigen
- Satzstellung markieren
- GIST -Integration
- Ansicht und Wiederholungsgeschichte
- Öffnen Sie Editoren, um Methoden mithilfe von Methoden zu bearbeiten
edit obj.my_method
Syntax
Eine Tonne tolle und originelle Funktionen
Anscheinend erfordert ein Stück Code, um in IRB zu fallen.
Hier ist der Link (scheint gut zu funktionieren).
http://jameskilton.com/2009/04/02/embedding-irb-into-your-ruby-anapplication
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
Diese Funktion ist bei Ruby 2.4 erhältlich. Sie können einfach verwenden binding.irb
Z.B
require 'irb'
a = 10
binding.irb
puts a
Wenn Sie den Code über den Code ausführen, erhalten Sie die IRB -Konsole, damit Sie die Werte lokaler Variablen und alles andere im Rahmen des Geltungsbereichs überprüfen können.
Quelle: http://blog.redpanthers.co/new--binding-irb-introducuby-2-4/
Ruby Commit: https://github.com/ruby/ruby/commit/493e48897421d176a8faf0f0820323d79ecdf94a
Fügen Sie diese Zeile einfach hinzu, wo Sie den Haltepunkt wünschen:
require 'ruby-debug';debugger
Aber ich schlage vor, Py anstelle von IRB zu verwenden, was super praktisch ist, und fügen Sie stattdessen die folgende Zeile ein:
require 'pry'; binding.pry
Ich bin ziemlich spät zum Spiel, aber wenn Sie bereits ein Skript innerhalb von IRB/Pry laden, ein einfaches raise
Arbeitet Sie auch an die IRB/Pry -Eingabeaufforderung. Ich benutze das ziemlich oft, wenn ich ein Schriften in der Schienenkonsole schreibe.