我正在尝试学习Byebug并且正在跟随(https://github.com/deivid-rodriguez/byebug/blob/master/GUIDE.md)并且我在设置断点时遇到困难并在断点设置后继续。在我为第5行设置断点并运行continue之后,Byebug退出会话。有人能看出我做错了吗?
$byebug hanoi.rb
[1, 10] in /Users/jackburum/ruby/byebug-testing/hanoi.rb
1: #
2: #
3: #
=> 4: def hanoi(n, a, b, c)
5: hanoi(n - 1, a, c, b) if n - 1 > 0
6:
7: puts "Move disk #{a} to #{b}"
8:
9: hanoi(n - 1, c, b, a) if n - 1 > 0
10: end
(byebug) break 5
Successfully created breakpoint with id 1
(byebug) continue
$byebug hanoi.rb
如果我运行下一个命令而不是继续,则会出现同样的问题......
[1, 10] in /Users/jackburum/ruby/byebug-testing/triangle.rb
=> 1: def triangle(n)
2: tri = 0
3:
4: 0.upto(n) { |i| tri += i }
5:
6: tri
7: end
8:
9: # if __FILE__ == $triangle.rb
10: # t = triangle(3)
(byebug) break 2
Successfully created breakpoint with id 1
(byebug) next
$
答案 0 :(得分:0)
你想在这里使用next
吗? continue
是相同的控件+ d,并将继续运行您的代码,直到达到另一个断点或代码结束。
我认为当你输入continue时,你的脚本的其余部分会运行并且程序会退出,因为没有另一个断点。
顺便说一下,尝试使用pry gem而不是byebug可能是值得的。与byebug不同,复制粘贴多行代码在pry中工作,还有许多其他有用的功能,如源代码浏览和语法突出显示。虽然它没有“下一个”或“继续”出框,但您可以安装pry-byebug
gem来获取这些内容。
根据您提供的其他信息,这似乎实际上是此处的预期行为。以下是您需要了解的断点:
他们不会遵循向下的范围变化。例如,假设我写了一个这样的方法:
def my_method
puts "my method started"
byebug
5.times { "do something in a loop" }
end
my_method()
puts "my method is done"
puts "the program will end now"
使用ruby myfile.rb
运行代码时,代码在暂停断点之前进入第6行。由于断点位于方法体内,因此在实际调用该方法之前不会激活它。
如果您输入next
会怎样?您需要输入5次才能通过5.times {}
循环吗?答案是否定的,这是因为迭代器有一个向下的范围变化。在Javascript中,这个“范围更改”更加清晰,因为您使用function
关键字来显示匿名函数(因此更改范围)。但在Ruby中,块实际上是Procs的语法糖,它们是匿名函数,因此引入了范围更改。我不确定确切的原因,但进入方法体也需要向下调整范围。
因此,当您按下一步时,实际发生的是它会转移到puts "my method is done"
来电。尽管byebug关键字位于方法内部,但要返回方法调用方的范围是“向上”范围更改并且是预期的。再次键入将移至puts "my program will end now"
行。再次键入它将到达代码的末尾并退出程序。
如果需要在循环中的每次迭代中暂停,可以将断点放在循环块中,即5.times { byebug }
将它带回到您的示例中 - 当您使用byebug可执行文件(即byebug myprogram.rb
)调用脚本时,初始范围是顶级的。键入next
将跳过任何函数或循环。除了非常小的程序之外,我不认为这是实用的,所以最好将byebug关键字放在代码中,然后使用ruby可执行文件调用程序,即ruby myprogram.rb
这是一个小细节,但当它们是程序的最后一行时会忽略断点。为了防止这种情况,请在断点之后放置任何内容,甚至是exit
之类的简单内容。
顺便说一句,就我所知,所有这些范围的东西也适用于撬。