Як я вийду з петлі з Ruby Pry?


212

Я використовую Pry зі своїм додатком Rails. Я встановив binding.pryвсередині циклу в своїй моделі, щоб спробувати усунути проблему. Наприклад:

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

Коли я набираю текст quit, він переходить до наступної ітерації і знову зупиняється. Чи є спосіб вийти з циклу, щоб мені не довелося вводити quit100 разів?

Наразі єдиний спосіб, коли я знаю, як вийти з нього, - це використовувати CTRL+ Cта перезапустити програму.

Відповіді:


412

Щоб вийти з Pry беззастережно, введіть

exit-program

Редагувати з коментаря @ Ніка : Також працює:

!!!

Дякую @Evandro, саме це я шукав!
Райан

Хоча ви, очевидно, потрапите на прив'язку відразу, використання просто exitдозволить програмі продовжувати працювати.
AJP

1
Це не спрацювало для мене під час бігу rspec. Але CTRL-C, двічі, зробив.
Ерік Уокер

5
на Mac OSX натискання Ctrl + Cдвічі знищить сеанс Pry, але також ефективно знищить це термінальне вікно: подальший вихід виблискується таким чином, що мені потрібно закрити цю вкладку терміналу та перейти до нової. Однак !!!не має цього обтяжуючого ефекту.
Тофер Хант

@Evandro Ви не знаєте, як це врятувало мене!
Шрі Харша Каппала

111

Я використовую:

disable-pry

Це дозволить тримати роботу програми, але не дозволить зупинити її виконання. Це особливо корисно при налагодженні в консолі.


11
Щоб повторно увімкнути (з командного рядка): ENV ['DISABLE_PRY'] = nil
stebooks

2
мені не вдалося повторно ввійти, коли я застосував функцію enable-pry. Навіть після використання ENV ['DISABLE_PRY'] = nil
шкідливий

2
Щоб знову ввійти в огляд, все, що вам потрібно зробити, - це встановити ENV['DISABLE_PRY'] = nilв контролері не командний рядок АБО консоль рейли.
Атул Хандурі

Це ідеальний варіант, який потрібно використовувати, коли ви використовуєте охорону, і просто хочете, щоб він припинив працювати підписом для цього тестового запуску. Він буде скинутий під час наступного тестового запуску.
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що дав мені systemExit. Цей просто працює. (На рейках 3.2.22.2, pry 0.10.3 та ruby 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.