【问题标题】:Truncate #inspect output in irb (ruby)在 irb (ruby) 中截断 #inspect 输出
【发布时间】:2010-12-08 07:20:14
【问题描述】:

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

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

还有其他解决方案吗?

  • 更改 $stdout ?
  • 其他?

【问题讨论】:

    标签: ruby stdout irb inspect


    【解决方案1】:

    对于干净的解决方案,gem install hirbhirb pages irb 的返回值,如果它们太长的话。

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

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

    我不建议这样做,因为它是一种 hack,并且在需要 ap 和 hirb 之类的宝石时会损坏。

    我建议您尝试ripl,而不是monkeypatching irb,这是一种旨在扩展的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 中。

    【讨论】:

      【解决方案2】:

      你的解决方案很好。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          如果是因为您有嵌套的哈希或难以破译的东西,请尝试 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。

          【讨论】:

            【解决方案5】:

            对于 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

            【讨论】:

              【解决方案6】:

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

              【讨论】:

              • @banister:我没想到你这么了解我!那是 +1 还是 -1?
              • 我阅读了您的拉取请求,从 ruby​​-core 中删除了脏话……您不是那种我会邀请参加晚宴的人! 打哈欠 ;)
              • @banister:啊,那个!无论如何,这意味着赞成还是反对?
              猜你喜欢
              • 1970-01-01
              • 2012-12-08
              • 1970-01-01
              • 2011-05-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多