How do I step out of a loop with Ruby Pry?

2019-01-29 16:02发布

问题:

I'm using Pry with my Rails application. I set binding.pry inside a loop in my model to try and debug a problem. For example:

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

When I type quit, it goes to the next iteration and stops again. Is there a way to step out of the loop so I don't have to type quit 100 times?

Currently the only way I know how to get out of it is to use CTRL+C and restart the application.

回答1:

To exit Pry unconditionally, type

exit-program


回答2:

I use:

disable-pry

This will keep the program running, but will keep it from continuing to stop execution. This is especially helpful when you are debugging in the console.



回答3:

To exit everything, use:

exit!

This should ignore all proceeding bindings.



回答4:

Triple exclamation (!!!) would do that.



回答5:

Use

disable-pry

To renable, add this to your controller

ENV['DISABLE_PRY'] = nil


回答6:

A binding.pry statement is exactly the same as a breakpoint in GDB. Such a breakpoint in GDB would be hit 100 times too.

If you only want the binding.pry to be hit once, for the first iteration of the loop, then use a conditional on the binding.pry like so:

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

You then exit the current session by just typing exit.



回答7:

Based on the two previous answers above:

  • https://stackoverflow.com/a/21735420/3137698
  • https://stackoverflow.com/a/24945487/3137698

Thank you guys! Your advices have helped me really a lot!

I just want to share a simple stupid trick, that I personally use to don't worry about the DISABLE_PRY environment variable all the time. Add this callback to the base controller ApplicationController of your project permanently. It would automatically re-enable PRY every time the disable-pry is called:

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

  private

  def reenable_pry
    ENV['DISABLE_PRY'] = nil
  end
end


回答8:

Using gem pry-moves you can step out of loop using f (finish command)


example:

    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