我已经加载了 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 - 读取评估打印循环。如果你深入研究他们的源代码,你会发现 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)
在您的代码中(确保需要 pp
、coderay
和 pry/color_printer
)
关于ruby-on-rails - 当你只传递一个对象时 pry 使用什么函数或方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24197757/