首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pry设置条件断点

使用pry设置条件断点
EN

Stack Overflow用户
提问于 2017-01-04 23:14:29
回答 2查看 2.3K关注 0票数 5

考虑到以下代码:

代码语言:javascript
复制
require 'pry-byebug'

10.times.with_index do |i|
  binding.pry
  puts i
end

我想“循环直到i == 5然后中断”,而在pry-byebug内部。通过运行help break,您似乎可以通过“断点#”或“行#”来识别断点。您似乎也可以使用条件,但我无法让它工作:

试图在行#上设置断点:

代码语言:javascript
复制
$  ruby foo.rb

From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :

    1: require 'pry-byebug'
    2:
    3: 10.times.with_index do |i|
    4:   binding.pry
 => 5:   puts i
    6: end

[1] pry(main)> break foo.rb:5 if i == 5

  Breakpoint 1: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ 5 (Enabled) Condition: i == 5


    2:
    3: 10.times.with_index do |i|
    4:   binding.pry
 => 5:   puts i
    6: end


[2] pry(main)> continue
0

From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :

    1: require 'pry-byebug'
    2:
    3: 10.times.with_index do |i|
    4:   binding.pry
 => 5:   puts i
    6: end

[2] pry(main)> i
=> 1

首先设置断点,然后在断点上设置条件:

代码语言:javascript
复制
➜  ~/D/w/t/pry_debug  ruby foo.rb

From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :

    1: require 'pry-byebug'
    2:
    3: 10.times.with_index do |i|
    4:   binding.pry
 => 5:   puts i
    6: end

[1] pry(main)> break foo.rb:15

  Breakpoint 1: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ 15 (Enabled)



[2] pry(main)> break --condition 1 i == 5
[3] pry(main)> c
0

From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :

    1: require 'pry-byebug'
    2:
    3: 10.times.with_index do |i|
    4:   binding.pry
 => 5:   puts i
    6: end

[3] pry(main)> i
=> 1

正如您所看到的,在这两种情况下,pry-byebug都不尊重这个条件,因为它停止得太快。我怎么才能让它起作用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-05 17:17:10

从循环内部删除binding.pry,并将其放在10.times之前

代码语言:javascript
复制
binding.pry
10.times.with_index do |i|

那就运行代码。当它到达断点时,使用您想要的条件和continue设置一个新的断点。

回到你的实际代码。别这么做:

代码语言:javascript
复制
10.times.with_index do |i|

相反,这将做几乎相同的事情,但它更简单:

代码语言:javascript
复制
10.times do |i|

Ruby正在做的事情如下:

代码语言:javascript
复制
>> 2.times.with_index.to_a
[
  [0] [
    [0] 0,
    [1] 0
  ],
  [1] [
    [0] 1,
    [1] 1
  ]
]

代码语言:javascript
复制
>> 2.times.to_a
[
  [0] 0,
  [1] 1
]

第一个是传入[0,0][1,1]等数组,因此为了正确起见,您的块参数需要如下所示:

代码语言:javascript
复制
10.times.with_index do |i, j|

第二个只传递当前的"times“值,从而得到更简单的代码。

票数 1
EN

Stack Overflow用户

发布于 2017-01-04 23:26:49

我认为一个简单的方法是在代码中这样做:

代码语言:javascript
复制
require 'pry-byebug'

10.times.with_index do |i|
  binding.pry if i == 5
  puts i
end

或者,如果您想在异常时停下来,您可以这样做:

代码语言:javascript
复制
require 'pry-byebug'

10.times.with_index do |i|
  puts i rescue binding.pry # if the puts command throws an exception, you'll be taken to pry
end
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41474811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档