3

我想截断 irb 中的#inspect 输出(必须将大输出裁剪为 MAX_LEN)。

目前,我为所有特定对象覆盖 :inspect, :to_s 方法。

还有其他解决方案吗?

  • 更改 $stdout ?
  • 其他?
4

6 回答 6

5

对于干净的解决方案,gem install hirb. hirb页面 irb 的返回值,如果它们变得太长。

如果你想monkeypatch irb:

module IRB
  class Irb
    def output_value
     @context.last_value.to_s.slice(0, MAX_LEN)
    end
  end
end

我不建议这样做,因为它是一种黑客攻击,并且在需要像 ap 和 hirb 这样的宝石时都会中断。

我建议不要使用monkeypatching irb,而是尝试ripl,这是一种旨在扩展的irb 替代方案。以上作为 ripl 插件将是:

require 'ripl'
module Ripl::SlicedInspect
  def format_result(result)
    result_prompt + result.inspect.slice(MAX_LEN)
  end
end
Ripl::Shell.send :include, Ripl::SlicedInspect

使用此插件,您可以根据需要使用它,或者如果您想始终使用它,可以将其添加到您的 ~/.riplrc 中。

于 2010-12-09T14:49:41.683 回答
1

你的解决方案很好。

它不涉及黑魔法,这可能会使代码难以理解且容易出错。

于 2010-12-08T12:45:15.573 回答
1

如果您只是在 IRB 中 - 您可以在 irb 本身中定义一个猴子补丁,或者加载一个文件,猴子补丁通过“加载”进行检查。通过这种方式,您可以将其排除在核心代码库之外,但您仍然可以获得所需的功能,而无需在您希望检查的每个类中覆盖检查......

于 2010-12-08T12:48:30.383 回答
1

对于 rails 3.1.1+,将下面的代码放在 helpers/irb_helper.rb

module IRB
  class Irb
    MAX_LEN = 10000

    def output_value
      if (@context.inspect_last_value.length > MAX_LEN)
        printf @context.return_format, "#{@context.inspect_last_value[0..MAX_LEN]} <- Truncated"
      else
        printf @context.return_format, @context.inspect_last_value
      end
    end
  end
end

如果您想更多地自定义输出,请在https://github.com/Ruby/Ruby/blob/trunk/lib/irb.rb查看 irb 的源代码

于 2011-12-15T21:19:13.460 回答
1

如果是因为你有一个嵌套的散列或一些难以破译的东西,试试 awesome_print。您可以通过将以下内容放入 .irbrc 中,使其成为 irb 中的默认输出格式化程序:

require 'ap'

module IRB
  class Irb
    def output_value
      ap @context.last_value
    end
  end
end

这使得具有大量数据的对象在 IRB 中易于破译。

即使您不使用 awesome_print,您也可以使用相同的技术截断输出,因此您不必在代码中覆盖 to_s。

于 2010-12-08T13:02:28.123 回答
0

我有时会修改对象本身(通过BoringInspect我将其include放入相关类的模块),以便也可以管理异常消息。

于 2011-12-15T22:47:51.677 回答