Como faço para sair de um loop com Ruby Pry?

212

Estou usando o Pry com meu aplicativo Rails. Defino binding.prydentro de um loop no meu modelo para tentar depurar um problema. Por exemplo:

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

Quando digito quit, ele passa para a próxima iteração e para novamente. Existe uma maneira de sair do loop para que eu não precise digitar quit100 vezes?

Atualmente, a única maneira de saber como sair disso é usar CTRL+ Ce reiniciar o aplicativo.

Ryan
fonte

Respostas:

412

Para sair do Pry incondicionalmente, digite

exit-program

Editar a partir do comentário de @ Nick : Também funciona:

!!!
Evandro
fonte
Obrigado @Evandro, era exatamente isso que eu estava procurando!
21712 Ryan
Embora você obviamente atinja a ligação imediatamente, usar apenas exitpermitirá que o programa continue em execução.
AJP
1
Isso não funcionou para mim durante a execução rspec. Mas o CTRL-C, duas vezes, funcionou.
Eric Walker
5
no Mac OSX, pressionar Ctrl + Cduas vezes matará a sessão do Pry, mas também matará efetivamente a janela do terminal: a saída subsequente é interrompida, de modo que eu preciso fechar a guia do terminal e passar para uma nova. No entanto !!!, não tem esse efeito agravante.
Topher Hunt
@ Evandro Você não tem idéia de como isso me salvou!
Sri Harsha Kappala
111

Eu uso:

disable-pry

Isso manterá o programa em execução, mas impedirá que continue a interromper a execução. Isso é especialmente útil quando você está depurando no console.

stebooks
fonte
11
Para reativar (na linha de comando): ENV ['DISABLE_PRY'] = nil
stebooks
2
não consegui reinserir o bisbilhotado depois de usar o comando desabilitar-bisbilhotado. Mesmo depois de usar ENV ['DISABLE_PRY'] = zero
daslicious
2
Para reinserir a alavanca, tudo que você precisa fazer é configurar ENV['DISABLE_PRY'] = nilno seu controlador, não na linha de comando OU no console de rails.
Atul Khanduri
Este é o perfeito para usar quando você está usando o guarda e só quer que ele pare de forçar a execução do teste. Ele será redefinido no próximo teste.
BBonifield 26/08/2015
31

Para sair de tudo, use:

exit!

Isso deve ignorar todas as ligações em andamento.

Blake
fonte
4
Isso também mata o servidor ao mesmo tempo. exit-programainda é provavelmente a melhor opção se você não deseja reiniciar o servidor.
Ryan
3
Só para esclarecer, exit-programvocê pode manter sua rails serversessão, mas parece jogar umSystemExit
Alan David Garcia
24

A exclamação tripla ( !!!) faria isso.

Hahn
fonte
Esta foi a solução para mim no OSX 10.11.4 (El Capitan), não tentei o disable-pry+ ENV['DISABLE_PRY'] = nilcombo, mas tentei o exit-programque me deu um sistemaSair. Este apenas funciona. (Nos trilhos 3.2.22.2, alavanca 0.10.3 e ruby 1.9.3)
SidOfc 28/04/16
17

Usar

disable-pry

Para desativar, adicione isso ao seu controlador

ENV['DISABLE_PRY'] = nil
Chet3x16
fonte
14

Uma binding.pryinstrução é exatamente igual a um ponto de interrupção no GDB. Esse ponto de interrupção no GDB também seria atingido 100 vezes.

Se você deseja que o binding.pryhit seja atingido apenas uma vez, na primeira iteração do loop, use uma condicional da seguinte binding.prymaneira:

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

Você sai da sessão atual digitando apenas exit.

horseyguy
fonte
1

Com base nas duas respostas anteriores acima:

Obrigado pessoal! Seus conselhos me ajudaram muito!

Eu só quero compartilhar um truque simples e estúpido, que eu pessoalmente uso para não me preocupar com a DISABLE_PRYvariável de ambiente o tempo todo. Adicione esse retorno de chamada ao controlador base ApplicationControllerdo seu projeto permanentemente. Ele reativaria automaticamente o PRY sempre que disable-pryfor chamado:

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

  private

  def reenable_pry
    ENV['DISABLE_PRY'] = nil
  end
end
zinovyev
fonte
1

Usando gem, pry-movesvocê pode sair do loop usando f(comando de acabamento)


exemplo:

    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
Daniel Garmoshka
fonte
0

pressione 'q' e você verá assim

[1] pry(#<AlbumsController>)>

tipo

exit

esta palavra fará, se não:

control + c
Heartless Vayne
fonte