Comment puis-je tomber à l'invite de la CISR à partir d'un script en cours d'exécution?
Question
Puis-je déposer une invite à la CISR à partir d'un script Ruby en cours d'exécution?
Je veux exécuter un script, mais alors il me donner une invite CISR à un point dans le programme avec l'état actuel du programme, mais pas seulement en exécutant rdebug et ayant un point d'arrêt.
La solution
vous pouvez utiliser-debug Ruby pour obtenir l'accès à irb
require 'rubygems'
require 'ruby-debug'
x = 23
puts "welcome"
debugger
puts "end"
lorsque le programme atteint débogueur vous aurez accès à irb.
Autres conseils
Pry (une alternative CISR) permet également de faire cela, en fait, il a été conçu à partir du sol pour exactement ce cas d'utilisation:)
Il est aussi facile que de mettre binding.pry
au point où vous voulez commencer la session:
require 'pry'
x = 10
binding.pry
Et à l'intérieur de la session:
pry(main)> puts x
=> 10
Consultez le site: http://pry.github.com
Pry nous allons vous:
- tomber dans une session à tout moment dans votre code
- Afficher le code source de la méthode
- Afficher la documentation de la méthode (ne pas utiliser RI de sorte que vous n'avez pas à pré-générer)
- pop dans et hors de différents contextes
- coloration syntaxique
- intégration essentiel
- et vue historique replay
- éditeurs ouverts à modifier les méthodes en utilisant la syntaxe
edit obj.my_method
Une tonne caractéristiques plus grandes et originales
apparemment, il a besoin d'un morceau de code à tomber dans RIR.
Voici le lien (semble bien fonctionner).
http://jameskilton.com/2009 / 04/02 / intégration-irb-en-votre-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
Cette fonction est disponible à partir de Ruby 2.4. Vous pouvez simplement utiliser binding.irb
par exemple.
require 'irb'
a = 10
binding.irb
puts a
Si vous exécutez le code ci-dessus, vous obtiendrez console RIR, de sorte que vous pouvez vérifier les valeurs des variables locales et toute autre chose qui est portée.
Source: http://blog.redpanthers.co / nouvelle liaison aux RIR-introduit-ruby-2-4 /
Ruby commit: https://github.com/ruby/ruby/commit/493e48897421d176a8faf0f0820323d79ecdf94a
Il suffit d'ajouter cette ligne à l'endroit où vous voulez que le point d'arrêt:
require 'ruby-debug';debugger
mais je suggère au lieu de l'utilisation pry RIR, ce qui est super pratique, insérez la ligne suivante à la place:
require 'pry'; binding.pry
Je suis assez tard pour le jeu, mais si vous chargez un script à partir de RIR / Pry déjà, un simple raise
fonctionne aussi vous ressortira à l'invite irb / pry. J'utilise cette assez souvent lors de l'écriture d'un arrêt des scripts dans la console rails.