如何在Ruby Pry中跳出循环?

240
我在我的Rails应用程序中使用Pry。我在模型中的循环中设置了binding.pry以尝试调试问题。例如:
(1..100).each do |i|
  binding.pry
  puts i
end
当我输入quit时,它会进入下一次迭代并再次停止。有没有一种方法可以跳出循环,这样我就不必输入100次quit
目前我知道的唯一方法是使用CTRL+C退出并重新启动应用程序。
10个回答

484

要无条件退出Pry,输入

exit-program

根据 @Nick 的评论进行编辑:也有效:

!!!

1
虽然你显然会立即触发绑定,但仅使用 exit 将允许程序继续运行。 - AJP
1
当我运行 rspec 时,这并没有起作用。但是按两次 CTRL-C 就可以了。 - Eric Walker
7
在Mac OSX上,按两次 Ctrl + C 将会终止Pry会话,但也会有效地关闭该终端窗口:随后的输出将出现故障,需要关闭该终端选项卡并转到新选项卡。然而,!!! 不会产生这种恼人的效果。 - Topher Hunt
@Evandro 你不知道这个救了我多少次! - Sri Harsha Kappala
警告:如果在rspec测试中使用它,可能会导致测试错误地通过。请改用@stebooks的答案:disable-pry - Adamantish
如果在Mac终端上使用Pry命令时遇到*图标,只需按一次Ctrl + C即可重新开始使用Pry。 - vikramvi

124

我使用:

disable-pry

这将使程序继续运行,但阻止其继续执行。在您在控制台调试时,这尤其有帮助。


15
重新启用(从命令行):ENV['DISABLE_PRY'] = nil - stebooks
2
我在使用disable-pry后无法重新进入pry。即使使用了ENV['DISABLE_PRY'] = nil。 - daslicious
2
要重新进入Pry,你只需要在控制器中设置ENV['DISABLE_PRY'] = nil,而不是在命令行或Rails控制台中。 - Radix
这是一个完美的选择,当你使用 guard 并且只想让它停止运行 pry 用于测试时。它会在下一次测试运行时重置。 - BBonifield

41

要退出所有内容,请使用:

exit!

这应该忽略所有之前的绑定。


6
同时这也会导致服务器崩溃。如果你不想重启服务器的话,exit-program 可能仍然是最好的选择。 - Ryan
3
只是为了澄清,“exit-program”命令允许你保持“rails server”的会话状态,但似乎会抛出“SystemExit”。 - Alan David Garcia

25

三个感叹号(!!!)就可以实现这个功能。


这是我在OSX 10.11.4(El Capitan)上的解决方案,我没有尝试disable-pry + ENV['DISABLE_PRY'] = nil组合,但我尝试了exit-program,它给了我一个systemExit。这个方法就有效了。(在rails 3.2.22.2,pry 0.10.3和ruby 1.9.3上) - SidOfc

19
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 命令来退出当前会话。


2
使用 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

2

基于上面两个答案:

谢谢你们!你们的建议真的帮了我很多!

我只想分享一个简单愚蠢的技巧,我个人使用它来不用一直担心DISABLE_PRY环境变量。将此回调添加到您项目的基本控制器ApplicationController中,它会在每次调用disable-pry时自动重新启用PRY:

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

  private

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

2
最初的回答:按下“q”键,您将看到与此相似的内容。
[1] pry(#<AlbumsController>)>

type

exit

最初的回答。如果不行,只需要一个单词即可:
control + c

0

如果您只需要调试一次迭代,您可以通过引发错误来跳过保证:

(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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接