¿Cómo puedo dejar caer en el mensaje IRB desde un script en ejecución?
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.
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.