gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:55:57 25 4
gpt4 key购买 nike

我已经加载了 pry 并且正在调试一些对象。很多时候,如果我只输入对象的名称,pry 就会自行输出它的表示形式,而且看起来很棒。

示例:

例如,这就像在 pry 提示符下做类似的事情:

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

结果:

困惑:

  • 我没有调用 pp @myobjy @myobjap @myobj@myobj.inspect
  • 如果我确实调用其中任何一个,我得到的输出看起来会有所不同(并且格式不那么漂亮)

问题:

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

最佳答案

Pry 是一个 REPL - 读取评估打印循环。如果你深入研究他们的源代码,你会发现 Print 部分最终由 Proc 处理,默认情况下,它调用 Pry::ColorPrinter 上的 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

您可以根据自己的喜好调整它。然后,您可以通过说类似 MyPrinter.pp(@myobj) 的内容来使用它。

如果您不担心调整它并且乐于依赖 Pry(及其所有依赖项),则不需要上述代码,只需使用 Pry::ColorPrinter.pp(@myobj) 在您的代码中(确保需要 ppcoderaypry/color_printer)

关于ruby-on-rails - 当你只传递一个对象时 pry 使用什么函数或方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24197757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com