Comment puis-je tomber à l'invite de la CISR à partir d'un script en cours d'exécution?

StackOverflow https://stackoverflow.com/questions/1144560

  •  16-09-2019
  •  | 
  •  

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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top