当你传递一个物体时,撬使用什么功能或方法?

时间:2014-06-13 04:30:33

标签: ruby-on-rails ruby debugging irb pry

我已加载pry并正在调试一些对象。通常,如果我只输入对象的名称pry将自己输出它的表示,它看起来很棒。

实施例

例如,它就像是在pry提示符并执行以下操作:

[1] pry(main):1> @myobj

结果:

混乱:

  • 我没有致电pp @myobjy @myobjap @myobj@myobj.inspect
  • 如果我打电话给任何一个,我会得到看起来不同的输出(而不是格式精美)

问题:

  • 以这种方式调用输出对象的方法是什么?
  • 我可以在脚本文件中使用该方法使用相同的格式输出格式吗? (即执行pry然后运行load /path/to/my/file.rb?)

1 个答案:

答案 0 :(得分:4)

Pry是一个REPL - 读取评估打印循环。如果您仔细查看其源代码,您将看到Print部分最终由Proc处理,默认情况下,它会调用Pry::ColorPrinter上的pp类方法。该类继承自::PP,它是负责pp输出的类,它只是做一些与颜色,分页等有关的额外内容。所以在大多数情况下,是的,它只是{{ 1}}。

这里基本上是他们的代码的复制粘贴,可以给你你想要的东西:

pp

你可以根据自己的喜好调整它。然后,您可以通过说require 'pp' require 'coderay' class MyPrinter < ::PP OBJ_COLOR = begin code = CodeRay::Encoders::Terminal::TOKEN_COLORS[:keyword] if code.start_with? "\e" code else "\e[0m\e[0;#{code}m" end end CodeRay::Encoders::Terminal::TOKEN_COLORS[:comment][:self] = "\e[1;34m" def self.pp(obj, out = $>, width = 79) q = new(out, width) q.guard_inspect_key { q.pp obj } q.flush out << "\n" end def text(str, width = str.length) if str.include?("\e[") super "#{str}\e[0m", width elsif str.start_with?('#<') || str == '=' || str == '>' super highlight_object_literal(str), width else super CodeRay.scan(str, :ruby).term, width end end def pp(obj) super end end 之类的内容来使用它。

如果您不担心调整它并且很高兴依赖MyPrinter.pp(@myobj)(及其所有依赖项),则不需要上述代码,只需使用Pry即可您的代码(确保需要Pry::ColorPrinter.pp(@myobj)ppcoderay