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


212

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

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

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

В настоящее время я знаю, как выйти из него - использовать CTRL+ Cи перезапустить приложение.

Ответы:


413

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

exit-program

Редактировать из комментария @ Ника : Также работает:

!!!

Спасибо @Evandro, это именно то, что я искал!
Райан

Хотя вы, очевидно, сразу же нажмете на привязку, использование just exitпозволит программе продолжить работу.
AJP

1
Это не работает для меня при запуске rspec. Но CTRL-C, дважды, сделал.
Эрик Уокер,

5
в Mac OSX нажатие Ctrl + Cдважды приведет к прекращению сеанса Pry, но также приведет к эффективному завершению этого окна терминала: последующий вывод будет сбит, так что мне нужно закрыть вкладку терминала и перейти к новой. Однако !!!не имеет этого отягчающего эффекта.
Topher Hunt

@Evandro Вы не представляете, как это спасло меня!
Шри Харша Каппала

111

Я использую:

disable-pry

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


11
Чтобы повторно включить (из командной строки): ENV ['DISABLE_PRY'] = nil
stebooks

2
я не смог повторно ввести pry после использования disable-pry. Даже после использования ENV ['DISABLE_PRY'] = nil
daslicious

2
Для повторного входа в pry все, что вам нужно сделать, это установить ENV['DISABLE_PRY'] = nilв своем контроллере не в командной строке ИЛИ в консоли rails.
Атул Кхандури

Это идеальный вариант для использования, когда вы используете guard и просто хотите, чтобы он прекратил запуск pry для этого тестового прогона. Он будет сброшен при следующем тесте.
BBonifield

31

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

exit!

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


4
Это также убивает сервер в то же время. exit-programпо-прежнему, вероятно, лучший вариант, если вы не хотите перезагружать сервер.
Райан

3
Просто чтобы прояснить, exit-programпозволяет вам поддерживать вашу rails serverсессию, но, кажется, броситьSystemExit
Алан Дэвид Гарсия

24

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


Это было решением для меня на OSX 10.11.4 (El Capitan), я не пробовал disable-pry+ ENV['DISABLE_PRY'] = nilкомбо, но я попытался, exit-programкоторый дал мне системный выход. Этот просто работает. (На рельсах 3.2.22.2, подглядывать 0.10.3 и рубин 1.9.3)
SidOfc

17

использование

disable-pry

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

ENV['DISABLE_PRY'] = nil

14

binding.pryУтверждение точно так же , как точки останова в GDB. Такая точка останова в GDB также будет достигнута 100 раз.

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

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

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


1

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

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

Я просто хочу поделиться простым глупым трюком, который я лично использую, чтобы не беспокоиться о 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

1

Используя 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.