【问题标题】:How do I step out of a loop with Ruby Pry?如何使用 Ruby Pry 跳出循环?
【发布时间】:2011-12-22 08:46:56
【问题描述】:

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

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

当我输入quit 时,它会进入下一次迭代并再次停止。有没有办法跳出循环,所以我不必输入quit 100 次?

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

【问题讨论】:

    标签: ruby-on-rails ruby loops exit pry


    【解决方案1】:

    如果你只需要调试一次迭代,你可以只提出错误,逃避保证:

    (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
    

    【讨论】:

      【解决方案2】:

      按 'q' 你会看到这样的

      [1] pry(#<AlbumsController>)>
      

      类型

      exit
      

      如果没有,这个词就可以了:

      control + c
      

      【讨论】:

        【解决方案3】:

        要无条件退出 Pry,请键入

        exit-program
        

        从@Nick 的评论中编辑:同样有效:

        !!!
        

        【讨论】:

        • 感谢@Evandro,这正是我想要的!
        • 虽然您显然会立即绑定,但仅使用 exit 将使程序继续运行。
        • 这在运行rspec 时对我不起作用。但是 CTRL-C 两次成功了。
        • 在 Mac OSX 上,按 Ctrl + C 两次将终止 Pry 会话,但也会有效地终止该终端窗口:后续输出出现故障,因此我需要关闭该终端选项卡并移动到新的一。但是!!! 没有这种加重效果。
        • @Evandro 你不知道这怎么救了我!
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          根据上面两个之前的答案:

          谢谢你们!您的建议对我帮助很大!

          我只是想分享一个简单的愚蠢技巧,我个人一直使用它来不用担心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
          

          【讨论】:

            【解决方案6】:

            binding.pry 语句与 GDB 中的断点完全相同。 GDB 中这样的断点也会被命中 100 次。

            如果您只希望 binding.pry 被点击一次,对于循环的第一次迭代,然后在 binding.pry 上使用条件,如下所示:

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

            然后您只需键入 exit 即可退出当前会话。

            【讨论】:

              【解决方案7】:

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

              exit!
              

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

              【讨论】:

              • 这也会同时杀死服务器。如果您不想重新启动服务器,exit-program 仍然可能是最佳选择。
              • 只是为了澄清exit-program 允许您维持rails server 会话,但似乎抛出SystemExit
              【解决方案8】:

              使用

              disable-pry
              

              要重新启用,请将其添加到您的控制器中

              ENV['DISABLE_PRY'] = nil
              

              【讨论】:

                【解决方案9】:

                三个感叹号 (!!!) 会这样做。

                【讨论】:

                • 这是我在 OSX 10.11.4 (El Capitan) 上的解决方案,我没有尝试disable-pry + ENV['DISABLE_PRY'] = nil 组合,但我确实尝试了exit-program,它给了我一个系统退出。这个只是工作。 (在 rails 3.2.22.2、pry 0.10.3 和 ruby 1.9.3 上)
                【解决方案10】:

                我用:

                disable-pry
                

                这将使程序继续运行,但不会继续停止执行。这在您在控制台中进行调试时特别有用。

                【讨论】:

                • 重新启用(从命令行):ENV['DISABLE_PRY'] = nil
                • 我在使用 disable-pry 后无法重新进入 pry。即使在使用 ENV['DISABLE_PRY'] = nil
                • 要重新进入 pry,您只需在控制器中设置 ENV['DISABLE_PRY'] = nil,而不是在命令行或 rails 控制台中。
                • 当您使用 guard 并且只是希望它停止运行 pry 以进行该测试运行时,这是一个完美的选择。它将在下一次测试运行时重置。
                猜你喜欢
                • 1970-01-01
                • 2012-01-23
                • 1970-01-01
                • 2020-08-08
                • 2016-02-08
                • 2012-03-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多