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

标签 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 ?)

最佳答案

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/

相关文章:

debugging - NodeJS - NodeJS 的分步调试器

linux - Qt Creator 无法在 Linux 上设置断点

java - 如何摆脱仅在 Debug模式下在 Android 应用程序中遇到的 ClassNotFoundException?

ruby-on-rails - 在 rails 应用程序中运行 ruby​​ 脚本

ruby-on-rails - XP 上的 Ruby on rails msvcrt-ruby191.dll 问题

ruby-on-rails - 如何在 Ruby 中并行递归下载 FTP 文件夹?

php - 垃圾邮件检测服务的最佳语言选择

ruby-on-rails - 如何将数字数组转换为范围

ruby-on-rails - Elasticsearch按Rails中的时间范围分组

ruby - 如何包含使用 FileUtils#sh 执行命令的管道?