¿Cómo puedo dejar caer en el mensaje IRB desde un script en ejecución?

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

  •  16-09-2019
  •  | 
  •  

Pregunta

¿Puedo dejar caer un mensaje IRB de un script de Ruby?

Quiero ejecutar un script, pero luego darme un mensaje IRB en un punto del programa con el estado actual del programa, pero no solo ejecutando Rdebug y tener un punto de interrupción.

¿Fue útil?

Solución

Puedes usar ruby-debug para obtener acceso a IRB

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

Cuando el programa llegue al depurador, obtendrá acceso a IRB.

Otros consejos

Palanca (una alternativa de IRB) también le permite hacer esto, de hecho, fue diseñado desde cero para exactamente este caso de uso :)

Es tan fácil como poner binding.pry En el momento que desea comenzar la sesión:

require 'pry'
x = 10
binding.pry

Y dentro de la sesión:

pry(main)> puts x
=> 10

Echa un vistazo a la página web: http://pry.github.com

Pry déjate:

  • Visite una sesión en cualquier momento de su código
  • Ver código fuente del método
  • Ver documentación del método (no usar RI para que no tenga que precenerarlo)
  • entrar y salir de diferentes contextos
  • Destacación de sintaxis
  • Integración GIST
  • Vista y reproducción del historial
  • Abra los editores para editar métodos utilizando edit obj.my_method sintaxis

Una tonelada más excelente y original características originales

Aparentemente requiere una parte de código para caer en IRB.

Aquí está el enlace (parece funcionar bien).

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

Esta característica está disponible en Ruby 2.4. Puedes simplemente usar binding.irb

P.ej

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

Si ejecuta el código anterior, obtendrá la consola IRB, para que pueda inspeccionar los valores de las variables locales y cualquier otra cosa que esté en alcance.

Fuente: http://blog.redpanthers.co/new-kinding-irbintroduced-ruby-2-4/

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

Simplemente agregue esta línea a donde desea el punto de interrupción:

require 'ruby-debug';debugger

Pero sugiero que use PRY en lugar de IRB, que es muy útil, inserte la siguiente línea: en su lugar:

require 'pry'; binding.pry

Llego bastante tarde al juego, pero si ya estás cargando un guión desde dentro de IRB/Pry, un simple raise También trabaja para que vuelva al mensaje IRB/PRY. Utilizo esto con bastante frecuencia cuando escribo uno apagado dentro de la consola Rails.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top