在irb(ruby)中截断#inspect输出

3

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

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

是否有其他解决方案?

  • 更改$stdout?
  • 其他?
6个回答

5

如果想要一个干净的解决方案,可以运行gem install hirbhirb可以对irb返回的值进行页面化处理,以防其过长。

如果你想要进行irb的猴子补丁:

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

我不建议这样做,因为它是一种hack方法,而且每次需要像ap和hirb这样的gems时都会出现问题。

与其对irb进行monkeypatching,我建议尝试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文件中。

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方法。


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

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


1

你的解决方案很好。

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


1

如果你只是在IRB中的话,你可以在IRB本身中定义一个monkeypatch,或者加载一个通过“load”monkeypatches inspect的文件。这样你就可以将其从核心代码库中分离出来,但你仍然可以获得所需的功能,而无需在每个你想检查的类中覆盖inspect....


0

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


@banister:我没想到你了解我这么多!那是+1还是-1? - Andrew Grimm
我看了你从ruby-core中删除脏话的pull request。你不是我会邀请参加晚宴的人!打哈欠 ;) - horseyguy
@banister:啊,那个!不管怎样,它是想要点赞还是踩呢? - Andrew Grimm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接