Ruby on rails 当你只是传递一个对象时,pry使用什么函数或方法?

Ruby on rails 当你只是传递一个对象时,pry使用什么函数或方法?,ruby-on-rails,ruby,debugging,irb,pry,Ruby On Rails,Ruby,Debugging,Irb,Pry,我已经加载了pry,正在调试一些对象。通常情况下,如果我只是键入对象的名称,pry会自己输出一个对象的表示,它看起来很棒 例子: 例如,这就像在pry提示符下执行以下操作: [1] pry(main):1> @myobj 结果: 困惑: 我没有打电话给pp@myobj或y@myobj或ap@myobj或@myobj.inspect 如果我调用了其中任何一个,我得到的输出看起来都不一样(而且格式也不太漂亮) 问题: 调用什么方法以这种方式输出对象 我可以在脚本文件中使用该方法以相同

我已经加载了
pry
,正在调试一些对象。通常情况下,如果我只是键入对象的名称,
pry
会自己输出一个对象的表示,它看起来很棒

例子: 例如,这就像在
pry
提示符下执行以下操作:

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

困惑:
  • 我没有打电话给
    pp@myobj
    y@myobj
    ap@myobj
    @myobj.inspect
  • 如果我调用了其中任何一个,我得到的输出看起来都不一样(而且格式也不太漂亮)
问题:
  • 调用什么方法以这种方式输出对象
  • 我可以在脚本文件中使用该方法以相同的格式输出格式吗?
    (即,执行
    pry
    ,然后运行
    load/path/to/my/file.rb
    ?)

Pry是一个REPL-Read-Evaluate打印循环。如果您深入研究它们的源代码,您将看到打印部分最终由一个Proc处理,默认情况下,该Proc调用上的
pp
类方法。该类继承自
::PP
,该类负责
PP
中的输出,它只做一些与颜色、分页等相关的额外工作。因此,在大多数情况下,是的,它只是
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
require'pp'
需要“coderay”
类MyPrinter<::PP
OBJ_颜色=开始
code=CodeRay::编码器::终端::标记颜色[:关键字]
如果code.start_与?“\e”
代码
其他的
“\e[0m\e[0;#{code}m”
结束
结束
CodeRay::编码器::终端::标记颜色[:注释][:自]=“\e[1;34m”
def self.pp(obj,out=$>,width=79)
q=新(向外,宽度)
q、 保护检查键{q.pp obj}
q、 冲洗

out看起来也可以做
Pry::ColorPrinter::pp(@myobj)
来得到我想要的;)但是如果没有你的帮助,我是不会得到这个的。