【问题标题】:Make Ruby console execution more verbose使 Ruby 控制台执行更加冗长
【发布时间】:2012-10-29 01:29:41
【问题描述】:

我想在控制台中查看我的 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 似乎相反,太冗长了。

【问题讨论】:

    标签: ruby debugging verbose


    【解决方案1】:

    您说的是“跟踪”功能。

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

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

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

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

    Debugging in Ruby”有很多不错的提示,您可能也会觉得有用。


    编辑:

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

    【讨论】:

      【解决方案2】:

      一种选择是使用set_trace_func (http://apidock.com/ruby/Kernel/set_trace_func) 来设置一个挂钩,该挂钩将在执行时打印出每一行。请注意,irb 的内部信息可能会让您不知所措。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多