¿Cómo salgo de un bucle con Ruby Pry?


212

Estoy usando Pry con mi aplicación Rails. Configuré binding.prydentro de un bucle en mi modelo para tratar de depurar un problema. Por ejemplo:

(1..100).each do |i|
  binding.pry
  puts i
end

Cuando escribo quit, pasa a la siguiente iteración y se detiene nuevamente. ¿Hay alguna forma de salir del ciclo para que no tenga que escribir quit100 veces?

Actualmente, la única forma en que sé cómo salir de esto es usar CTRL+ Cy reiniciar la aplicación.

Respuestas:


412

Para salir de Pry incondicionalmente, escriba

exit-program

Editar desde el comentario de @ Nick : También funciona:

!!!

¡Gracias @Evandro, eso es exactamente lo que estaba buscando!
Ryan

Aunque obviamente golpeará el enlace de inmediato, usar solo exitpermitirá que el programa continúe ejecutándose.
AJP

1
Esto no funcionó para mí cuando se ejecuta rspec. Pero CTRL-C, dos veces, lo hizo.
Eric Walker

55
en Mac OSX, presionar Ctrl + Cdos veces matará la sesión de Pry, pero también matará efectivamente esa ventana de terminal: la salida posterior se interrumpe de forma tal que necesito cerrar esa pestaña de terminal y pasar a una nueva. Sin embargo !!!, no tiene este efecto agravante.
Topher Hunt

@Evandro ¡No tienes idea de cómo esto me salvó!
Sri Harsha Kappala

111

Yo suelo:

disable-pry

Esto mantendrá el programa en ejecución, pero evitará que continúe deteniendo la ejecución. Esto es especialmente útil cuando está depurando en la consola.


11
Para volver a habilitar (desde la línea de comandos): ENV ['DISABLE_PRY'] = nil
stebooks

2
No pude volver a ingresar después de usar disable-pry. Incluso después de usar ENV ['DISABLE_PRY'] = nil
daslicious el

2
Para volver a entrometerse, todo lo que necesita hacer es configurar ENV['DISABLE_PRY'] = nilsu controlador no en la línea de comandos O en la consola de rieles.
Atul Khanduri

Este es el perfecto para usar cuando estás usando guardia y solo quieres que deje de hacer palanca para esa prueba. Se restablecerá en la próxima ejecución de prueba.
BBonifield

31

Para salir de todo, use:

exit!

Esto debería ignorar todos los enlaces en curso.


44
Esto también mata al servidor al mismo tiempo. exit-programsigue siendo probablemente la mejor opción si no desea reiniciar el servidor.
Ryan

3
Solo para aclarar le exit-programpermite mantener su rails serversesión, pero parece lanzar unSystemExit
Alan David Garcia

24

La triple exclamación ( !!!) haría eso.


Esta fue la solución para mí en OSX 10.11.4 (El Capitan), no probé el combo disable-pry+ ENV['DISABLE_PRY'] = nilpero intenté lo exit-programque me dio un sistema Salir. Este simplemente funciona. (En rieles 3.2.22.2, palanca 0.10.3 y rubí 1.9.3)
SidOfc

17

Utilizar

disable-pry

Para renombrar, agregue esto a su controlador

ENV['DISABLE_PRY'] = nil

14

Una binding.prydeclaración es exactamente lo mismo que un punto de interrupción en GDB. Tal punto de interrupción en GDB también se vería afectado 100 veces.

Si solo desea binding.pryque se golpee una vez, para la primera iteración del bucle, use un condicional en el me binding.prygusta así:

(1..100).each do |i|
  binding.pry if i == 1
  puts i
end

Luego sale de la sesión actual simplemente escribiendo exit.


1

Basado en las dos respuestas anteriores anteriores:

¡Gracias chicos! ¡Tus consejos me han ayudado mucho!

Solo quiero compartir un simple truco estúpido, que personalmente uso para no preocuparme por la DISABLE_PRYvariable de entorno todo el tiempo. Agregue esta devolución de llamada al controlador base ApplicationControllerde su proyecto de forma permanente. Volvería a habilitar PRY automáticamente cada vez que disable-pryse llame al:

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :reenable_pry

  private

  def reenable_pry
    ENV['DISABLE_PRY'] = nil
  end
end

1

Usando gema pry-movespuedes salir del bucle usando f(comando terminar)


ejemplo:

    42: def test
    43:   3.times do |i|
 => 44:     binding.pry
    45:     puts i
    46:   end
    47:   puts :finish
    48: end

[1] pry(main)> f
0
1
2

Frame: 0/1 method
From: playground/sand.rb:47 main

    42: def test
    43:   3.times do |i|
    44:     binding.pry
    45:     puts i
    46:   end
 => 47:   puts :finish
    48: end

0

presione 'q' y verá así

[1] pry(#<AlbumsController>)>

tipo

exit

esta palabra servirá, si no:

control + c
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.