给出以下代码:
require 'pry-byebug'
10.times.with_index do |i|
binding.pry
puts i
end
Run Code Online (Sandbox Code Playgroud)
我想i == 5在里面"循环直到破裂" pry-byebug.从运行它help break看起来你可以通过"断点#"或"行#"识别断点.它似乎也可以使用条件,但是我没有让它工作:
试图在#行上设置断点:
$ 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
Run Code Online (Sandbox Code Playgroud)
首先设置断点然后将条件放在断点上:
? ~/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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在这两种情况下pry-byebug都不尊重条件,因为它太快停止了.我如何让它工作?
我认为一种简单的方法是在您的代码中执行此操作:
require 'pry-byebug'
10.times.with_index do |i|
binding.pry if i == 5
puts i
end
Run Code Online (Sandbox Code Playgroud)
或者,如果您想停在异常处,可以执行以下操作:
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
Run Code Online (Sandbox Code Playgroud)
binding.pry从循环内部删除并将其放在之前10.times:
binding.pry
10.times.with_index do |i|
Run Code Online (Sandbox Code Playgroud)
然后运行代码。当它到达断点时,然后使用所需的条件设置一个新断点 和continue。
回到你的实际代码。不要这样做:
10.times.with_index do |i|
Run Code Online (Sandbox Code Playgroud)
相反,这几乎会做同样的事情,但更简单:
10.times do |i|
Run Code Online (Sandbox Code Playgroud)
这是 Ruby 正在做的事情:
>> 2.times.with_index.to_a
[
[0] [
[0] 0,
[1] 0
],
[1] [
[0] 1,
[1] 1
]
]
Run Code Online (Sandbox Code Playgroud)
与
>> 2.times.to_a
[
[0] 0,
[1] 1
]
Run Code Online (Sandbox Code Playgroud)
[0,0]第一个是传入、等数组[1,1],因此为了正确性,您的块参数需要类似于:
10.times.with_index do |i, j|
Run Code Online (Sandbox Code Playgroud)
第二个仅传递当前的“times”值,从而产生更简单的代码。
| 归档时间: |
|
| 查看次数: |
887 次 |
| 最近记录: |