简体   繁体   中英

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

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.

To exit Pry unconditionally, type

exit-program

Edit from @Nick's comment : Also works:

!!!

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.

To exit everything, use:

exit!

This should ignore all proceeding bindings.

三重感叹号 ( !!! ) 会做到这一点。

Use

disable-pry

To renable, add this to your controller

ENV['DISABLE_PRY'] = nil

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 .

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

press 'q' and you will see just like this

[1] pry(#<AlbumsController>)>

type

exit

this one word will do, if not:

control + c

Based on the two previous answers above:

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

If you just need to debug one iteration, you can just raise error, escape guarantee :

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

Or with condition :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM