Jak wyjść z pętli z Ruby Pry?

Używam Pry z moją aplikacją Rails. Ustawiam binding.pry wewnątrz pętli w moim modelu, aby spróbować debugować problem. Na przykład:

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

Kiedy wpiszę quit, przechodzi do następnej iteracji i zatrzymuje się ponownie. Czy jest sposób, aby wyjść z pętli, żebym nie musiał pisać quit 100 razy?

Obecnie jedynym sposobem na wydostanie się z niego jest użycie CTRL+C i uruchom ponownie aplikację.

Author: the Tin Man, 2011-11-04

9 answers

Aby wyjść z Prypeci, wpisz

exit-program

Edit from @ Nick ' s comment : działa również:

!!!
 422
Author: Evandro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-22 14:05:26

Używam:

disable-pry

To spowoduje, że program będzie działał, ale powstrzyma go przed kontynuowaniem wykonywania. Jest to szczególnie przydatne podczas debugowania w konsoli.

 114
Author: stebooks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-12 17:39:07

Aby wyjść ze wszystkiego, użyj:

exit!

Powinno to ignorować wszystkie trwające wiązania.

 33
Author: Blake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 16:22:43

Potrójny wykrzyknik (!!!) zrobiłby to.

 25
Author: Hahn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 16:20:45

Użyj

disable-pry

Aby zmienić, dodaj to do kontrolera

ENV['DISABLE_PRY'] = nil
 17
Author: Chet3x16,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 16:22:23

Instrukcja binding.pry jest dokładnie taka sama jak punkt przerwania w GDB. Taki punkt przerwania w GDB też zostałby trafiony 100 razy.

Jeśli chcesz, aby binding.pry został trafiony tylko raz, dla pierwszej iteracji pętli, użyj warunkowego binding.pry w ten sposób:

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

Następnie kończysz bieżącą sesję, wpisując exit.

 14
Author: horseyguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 16:23:08

Używając gem pry-moves możesz wyjść z pętli używając f (polecenie Zakończ)


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
 2
Author: Daniel Garmoshka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-07 13:58:31

Na podstawie dwóch poprzednich odpowiedzi powyżej:

Dziękuję wam! Twoje rady bardzo mi pomogły!

Chcę podzielić się prostą, głupią sztuczką, której osobiście używam, aby nie martwić się o zmienną środowiskową DISABLE_PRY przez cały czas. Dodaj to wywołanie zwrotne do podstawowego kontrolera ApplicationController twojego projektu na stałe. Byłoby automatycznie włącz ponownie PRY za każdym razem, gdy wywołane jest disable-pry:

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

  private

  def reenable_pry
    ENV['DISABLE_PRY'] = nil
  end
end
 1
Author: zinovyev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-15 07:57:52

Naciśnij "q" , a zobaczysz dokładnie tak

[1] pry(#<AlbumsController>)>

Typ

exit

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

control + c
 1
Author: Noe Fabellon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-29 07:15:35