3

当我在控制台中时,我想观察我的 ruby​​ 代码的执行流程。例如,如果我有这个:

def process
  hash = {a:1,b:2}
  hash.values.map!{|e| e+1}
end

当我输入以下内容时,我想在控制台中看到类似的内容process

hash = {a:1,b:2}
=> {:a=>1, :b=>2}
hash.values.map!{|e| e+1}
=> [2, 3]

有没有一种有用的方法来做这样的事情?

$VERBOSE似乎没有做任何事情,而且$DEBUG似乎相反过于冗长。

4

3 回答 3

5

您在谈论“跟踪”功能。

一些语言,如 shell 和 good-ol' GWBasic,有一个标志来显示它们当前正在执行的行。Ruby 的$DEBUG输出可能会使您充满信息过载,而不是来自您的代码,而是来自任何寻找它并转储其当前状态或打开其跟踪的 gem。

许多人在他们的代码中撒上一些代码,puts以便在他们的开发/测试过程中显示他们所处的位置。如果您这样做,我建议您将其编写为一种限制输出并让您轻松打开/关闭它的方法。此外,使用标志来检查您是否要调试。您甚至可能希望使用 OptionParser 让您创建一个--debug标志以在命令行上传递。使用方法的另一个很好的副作用是很容易将输出重定向到一个文件,tail并在输出发生时观察它,然后用于分类。

另一种选择是将代码加载到调试器中并告诉它进行跟踪。你会看到代码的每一步,非常冗长,但细节很好。您还可以告诉它运行到某些点,以便您可以戳代码并四处挖掘,如果需要,可以放入 IRB。

就我个人而言,我是老派并且对汇编语言有所了解,我对调试器很满意,所以我经常使用 Ruby。告诉它运行到某个位置并停止很容易,或者您可以嵌入include 'debugger'; debugger到您的代码中,它会在该点停止。一旦到了那里,就可以看到发生了什么,然后c继续,让程序运行,直到它debugger再次命中语句。我发现调试器非常强大,并且在我想知道发生了什么的时候是一个很好的选择性放大镜。

Ruby 中的调试” 有很多不错的技巧,您可能会发现它们也很有用。


编辑:

我喜欢 Alex D 建议研究 Ruby 的set_trace_func. 我没有使用过它(坦率地说,我忘了它),但这是在应用程序中设置良好跟踪的好方法。使用一些代码,您可以设置打开/关闭它并有选择地输出给定的特定类或条件,因为您可以控制proc被调用。

于 2012-11-08T19:22:53.017 回答
4

一种选择是使用set_trace_func(http://apidock.com/ruby/Kernel/set_trace_func) 设置一个挂钩,该挂钩将在执行时打印出每一行。请注意,大量有关irb.

另一种选择是深入研究源代码irb并添加一个选项以在执行每一行时打印它。

于 2012-11-08T19:25:20.527 回答
2

你试过撬宝石吗?放入require 'pry'; binding.pry您的代码并运行您的脚本。您将在放置它的地方有一个 ruby​​ 控制台。也许这就是你正在寻找的。

否则你应该看看一个 ruby​​ 调试器。

于 2012-11-08T19:24:25.993 回答