Jak wyjść z pętli za pomocą Ruby Pry?

212

Używam Pry z aplikacją Rails. Ustawić binding.prywewnątrz pętli w moim modelu, aby spróbować i debugowania problem. Na przykład:

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

Kiedy piszę quit, przechodzi do następnej iteracji i zatrzymuje się ponownie. Czy istnieje sposób na wyjście z pętli, aby nie musiałem pisać quit100 razy?

Obecnie jedynym sposobem, w jaki mogę się z tego wydostać, jest użycie CTRL+ Ci ponowne uruchomienie aplikacji.

Ryan
źródło

Odpowiedzi:

412

Aby bezwarunkowo zakończyć Pry, wpisz

exit-program

Edytuj z komentarza @ Nicka : Działa również:

!!!
Evandro
źródło
Dzięki @Evandro, właśnie tego szukałem!
Ryan
Chociaż oczywiście uderzysz w wiązanie od razu, użycie just exitpozwoli programowi działać dalej.
AJP
1
Nie działało to dla mnie podczas uruchamiania rspec. Ale CTRL-C dwukrotnie.
Eric Walker,
5
w Mac OSX, Ctrl + Cdwukrotne naciśnięcie zabije sesję Pry, ale także skutecznie zabije to okno terminala: kolejne dane wyjściowe są zniekształcone, tak że muszę zamknąć kartę terminala i przejść do nowej. Jednak !!!nie ma tego działania obciążającego.
Topher Hunt
@Evandro Nie masz pojęcia, jak mnie to uratowało!
Sri Harsha Kappala,
111

Używam:

disable-pry

Utrzyma to działanie programu, ale powstrzyma go przed zatrzymaniem wykonywania. Jest to szczególnie przydatne podczas debugowania w konsoli.

książki
źródło
11
Aby ponownie włączyć (z wiersza poleceń): ENV ['DISABLE_PRY'] = zero
stebooks
2
nie byłem w stanie ponownie wprowadzić pry po użyciu disable-pry. Nawet po użyciu ENV ['DISABLE_PRY'] = zero
daslicious
2
Aby ponownie wprowadzić podważ, wystarczy ustawić ENV['DISABLE_PRY'] = nilw kontrolerze, a nie w wierszu poleceń LUB w konsoli szyn.
Atul Khanduri,
Jest to idealny do użycia, gdy używasz osłony i po prostu chcesz, aby przestał podważać podczas tego testu. Zresetuje się przy następnym uruchomieniu testowym.
BBonifield,
31

Aby wyjść ze wszystkiego, użyj:

exit!

To powinno zignorować wszystkie powiązane powiązania.

Blake
źródło
4
To także zabija serwer w tym samym czasie. exit-programjest prawdopodobnie najlepszą opcją, jeśli nie chcesz ponownie uruchamiać serwera.
Ryan
3
Tylko wyjaśnienie exit-programpozwala na kontynuację rails serversesji, ale wydaje się, że rzuciłSystemExit
Alan David Garcia
24

Potrafiłby to potrójny wykrzyknik ( !!!).

Hahn
źródło
To było dla mnie rozwiązanie na OSX 10.11.4 (El Capitan), nie próbowałem kombinacji disable-pry+, ENV['DISABLE_PRY'] = nilale próbowałem, exit-programco dało mi wyjście systemowe. Ten po prostu działa. (Na szynach 3.2.22.2, podważ 0.10.3 i ruby 1.9.3)
SidOfc 28.04.16
17

Posługiwać się

disable-pry

Aby ponownie włączyć, dodaj to do kontrolera

ENV['DISABLE_PRY'] = nil
Chet3x16
źródło
14

binding.pryStwierdzenie jest dokładnie taka sama jak przerwania w GDB. Taki punkt przerwania w GDB zostałby również trafiony 100 razy.

Jeśli chcesz, binding.pryaby uderzył tylko raz, dla pierwszej iteracji pętli, użyj warunku binding.prypodobnego:

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

Następnie wychodzisz z bieżącej sesji po prostu wpisując exit.

horseyguy
źródło
1

Na podstawie dwóch poprzednich odpowiedzi powyżej:

Dzięki chłopaki! Twoje porady bardzo mi pomogły!

Chcę tylko podzielić się prostą głupią sztuczką, której osobiście używam, aby nie martwić się o DISABLE_PRYzmienną środowiskową przez cały czas. Dodaj to wywołanie zwrotne do podstawowego kontrolera ApplicationControllerprojektu na stałe. Automatycznie ponownie włączy PRY za każdym razem, gdy disable-pryzostanie wywołane:

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

  private

  def reenable_pry
    ENV['DISABLE_PRY'] = nil
  end
end
zinovyev
źródło
1

Za pomocą klejnotu pry-movesmożesz wyjść z pętli za pomocą f(polecenie zakończenia)


przykład:

    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
źródło
0

naciśnij „q”, a zobaczysz dokładnie tak

[1] pry(#<AlbumsController>)>

rodzaj

exit

to jedno słowo wystarczy, jeśli nie:

control + c
Heartless Vayne
źródło