Как выйти из цикла с Ruby Pry?

Я использую Pry со своим приложением Rails. Я установил binding.pry внутри цикла в своей модели, чтобы попытаться отладить проблему. Например:

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

Когда я набираю quit, он переходит к следующей итерации и снова останавливается. Есть ли способ выйти из цикла, чтобы мне не приходилось вводить quit 100 раз?

В настоящее время единственный известный мне способ выйти из этого — использовать CTRL+C и перезапустить приложение.


person Ryan    schedule 04.11.2011    source источник


Ответы (10)


Чтобы выйти из Pry безоговорочно, введите

exit-program

Изменить из комментария @Nick: также работает:

!!!
person Evandro    schedule 27.06.2012
comment
Спасибо @Evandro, это именно то, что я искал! - person Ryan; 28.06.2012
comment
Хотя вы, очевидно, сразу попадете в привязку, использование только exit позволит программе продолжать работать. - person AJP; 17.08.2012
comment
Это не сработало для меня при запуске rspec. Но CTRL-C дважды сделал это. - person Eric Walker; 25.07.2013
comment
в Mac OSX двойное нажатие Ctrl + C убьет сеанс Pry, но также эффективно убьет это окно терминала: последующий вывод сбивается, так что мне нужно закрыть эту вкладку терминала и перейти к новой. Однако !!! не имеет такого отягчающего эффекта. - person Topher Hunt; 02.04.2015
comment
@Evandro Вы не представляете, как это меня спасло! - person Sri Harsha Kappala; 20.04.2016
comment
Предупреждение: при использовании внутри теста rspec это может привести к тому, что тест станет ложно зеленым. Вместо этого используйте ответ @stebooks: disable-pry - person Adamantish; 20.07.2016
comment
Если кто-то нажал значок *, показанный в команде pry с терминала Mac, нажмите один Ctrl + C, чтобы снова начать использовать Pry. - person vikramvi; 22.03.2017

Я использую:

disable-pry

Это заставит программу работать, но не позволит ей продолжить выполнение. Это особенно полезно при отладке в консоли.

person stebooks    schedule 12.02.2014
comment
Чтобы снова включить (из командной строки): ENV['DISABLE_PRY'] = nil - person stebooks; 13.06.2014
comment
я не смог повторно войти в pry после использования disable-pry. Даже после использования ENV['DISABLE_PRY'] = nil - person daslicious; 31.10.2014
comment
Чтобы повторно войти в pry, все, что вам нужно сделать, это установить ENV['DISABLE_PRY'] = nil в вашем контроллере, а не в командной строке ИЛИ консоли rails. - person Atul Khanduri; 09.06.2015
comment
Это идеальный вариант для использования, когда вы используете защиту и просто хотите, чтобы она перестала запускать pry для этого тестового прогона. Он будет сброшен при следующем тестовом прогоне. - person BBonifield; 26.08.2015

Чтобы выйти из всего, используйте:

exit!

Это должно игнорировать все последующие привязки.

person Blake    schedule 14.08.2013
comment
Это также убивает сервер в то же время. exit-program по-прежнему, вероятно, лучший вариант, если вы не хотите перезапускать сервер. - person Ryan; 15.08.2013
comment
Просто уточню, что exit-program позволяет вам поддерживать сеанс rails server, но, похоже, вызывает SystemExit - person Alan David Garcia; 14.01.2014

Тройной восклицательный знак (!!!) сделает это.

person Hahn    schedule 17.11.2014
comment
Это было решение для меня на OSX 10.11.4 (El Capitan), я не пробовал комбинацию disable-pry + ENV['DISABLE_PRY'] = nil, но я попробовал exit-program, что дало мне выход из системы. Этот просто работает. (На rails 3.2.22.2, pry 0.10.3 и ruby 1.9.3) - person SidOfc; 28.04.2016

Использовать

disable-pry

Чтобы включить, добавьте это в свой контроллер

ENV['DISABLE_PRY'] = nil
person Chet3x16    schedule 24.07.2014

Оператор binding.pry точно такой же, как точка останова в GDB. Такая точка останова в GDB тоже сработает 100 раз.

Если вы хотите, чтобы binding.pry срабатывало только один раз, для первой итерации цикла, используйте условное выражение для binding.pry следующим образом:

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

Затем вы выходите из текущего сеанса, просто набрав exit.

person horseyguy    schedule 04.11.2011

Используя gem pry-moves, вы можете выйти из цикла, используя f (команда завершения)


пример:

    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
person Daniel Garmoshka    schedule 07.10.2018

нажми "q" и увидишь вот так

[1] pry(#<AlbumsController>)>

тип

exit

это одно слово будет делать, если нет:

control + c
person Noe Fabellon    schedule 29.05.2019

На основании двух предыдущих ответов выше:

Спасибо вам, ребята! Ваши советы мне очень помогли!

Я просто хочу поделиться простым глупым трюком, который я лично использую, чтобы не беспокоиться о переменной окружения DISABLE_PRY все время. Добавьте этот обратный вызов к базовому контроллеру ApplicationController вашего проекта на постоянной основе. Он будет автоматически повторно включать PRY каждый раз, когда вызывается 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
person zinovyev    schedule 15.06.2018

Если вам просто нужно отладить одну итерацию, вы можете просто вызвать ошибку, избежать гарантии:

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

Или с условием:

(1..100).each do |i|
  if i == 50
    binding.pry 
    raise
  end
  puts i
end
person Maxime Boué    schedule 18.05.2021