如何使用Ruby Pry跳出循环?


212

我在Rails应用程序中使用了Pry。我binding.pry在模型中的一个循环中进行设置,以尝试调试问题。例如:

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

当我键入时quit,它将转到下一个迭代,然后再次停止。有没有一种方法可以使您跳出循环,因此我不必键入quit100次?

目前,我知道如何摆脱它的唯一方法是使用CTRL+ C并重新启动应用程序。

Answers:


412

要无条件退出Pry,请输入

exit-program

通过@Nick的评论进行编辑:也可以:

!!!

谢谢@Evandro,这正是我想要的!
瑞安

尽管您显然会立即绑定,但是使用just exit将使程序继续运行。
AJP 2012年

1
跑步时这对我不起作用rspec。但是CTRL-C两次。
埃里克·沃克

5
在Mac OSX上,按Ctrl + C两次将终止Pry会话,但也将有效终止该终端窗口:后续输出出现故障,因此我需要关闭该终端选项卡并移至新窗口。但是!!!没有这种加剧的作用。
Topher Hunt

@Evandro你不知道这如何救了我!
Sri Harsha Kappala '16

111

我用:

disable-pry

这将使程序保持运行状态,但将阻止其继续停止执行。在控制台中进行调试时,这特别有用。


11
要重新启用(从命令行):ENV ['DISABLE_PRY'] = nil
stebooks 2014年

2
使用disable-pry后,我无法重新进入pry。即使使用ENV ['DISABLE_PRY'] = nil
令人讨厌的2014年

2
要重新进入,您所需要做的就是ENV['DISABLE_PRY'] = nil在控制器中而不是在命令行或Rails控制台中进行设置。
Atul Khanduri 2015年

当您使用后卫并且只希望它停止进行该次试运行时,这是一个完美的选择。它将在下一次测试运行时重置。
BBonifield,2015年

31

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

exit!

这应该忽略所有正在进行的绑定。


4
这也同时杀死了服务器。exit-program如果您不想重新启动服务器,它仍然可能是最佳选择。
瑞安

3
只是为了澄清exit-program,您可以保持自己的rails server会话状态,但似乎会抛出SystemExit
Alan David Garcia 2014年

24

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


这是在OSX 10.11.4(El Capitan)上为我解决的方案,我没有尝试disable-pry+ ENV['DISABLE_PRY'] = nil组合键,但确实尝试exit-program了给我一个systemExit。这只是工作。(在轨道 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永久添加到项目的基本控制器。每当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

1

使用gem pry-moves您可以使用f(finish命令)跳出循环


例:

    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

0

按“ q”,您将看到这样

[1] pry(#<AlbumsController>)>

类型

exit

如果没有的话,这一个字就能做到:

control + c
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.