使Ruby控制台执行更加冗长

时间:2012-11-08 19:10:01

标签: ruby debugging verbose

我想做一件简单的事,但我找不到办法去做。我只是想在我在控制台时观察流程执行我的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似乎与过于冗长相反。

3 个答案:

答案 0 :(得分:4)

您正在谈论"追踪"功能。

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

许多人在{/ 1}}中添加代码,以便在开发/测试期间显示它们的位置。如果你这样做,我建议把它写成一种瓶颈输出的方法,让你轻松打开/关闭它。另外,使用标志来检查是否要调试。您甚至可能希望使用OptionParser来创建puts标志以传递命令行。使用方法的另一个好处是,可以轻松地将输出重定向到可以--debug的文件,并在输出时观察输出,然后用于分类。

另一种方法是将代码加载到调试器中并告诉它跟踪。您将看到代码的每一步,这非常详细,但细节很好。您还可以告诉它运行到某些点,这样您就可以查看代码并挖掘,如果需要,可以进入IRB。

就个人而言,作为老派并且在汇编语言上磨牙,我对调试器很满意,所以我使用Ruby很多。告诉它跑到某个地方并停止很容易,或者你可以将tail嵌入到你的代码中,它会在那时停止。在那里,可以看到发生了什么,然后include 'debugger'; debugger继续,让程序运行直到它再次到达c语句。我发现调试器功能非常强大,并且在那些我想知道发生了什么的时候,它是一个很好的选择放大镜。

" Debugging in Ruby"有许多你可能会觉得有用的好建议。


编辑:

我喜欢Alex D建议调查Ruby的debugger。我还没有使用它(并且,坦率地忘记了它),但这是在应用程序中设置好的跟踪的好方法。使用一些代码,您可以设置开关切换,并选择输出给定的某个类或条件,因为您可以控制被调用的set_trace_func

答案 1 :(得分:3)

一种选择是使用set_trace_func(http://apidock.com/ruby/Kernel/set_trace_func)设置一个钩子,它将在执行时打印出每一行。请注意,irb的内部信息可能会让您感到震惊。

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

答案 2 :(得分:1)

你试过pry gem吗?将require 'pry'; binding.pry放入代码中并运行脚本。你将把它放在一个红宝石控制台。也许这就是你要找的东西。

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