Обрезать вывод #inspect в irb (ruby) - PullRequest
3 голосов
/ 08 декабря 2010

Я хочу обрезать вывод #inspect в irb (большой вывод должен быть обрезан до MAX_LEN).

В настоящее время я переопределяю: inspect,: to_s методы для всех конкретных объектов.

Есть ли другое решение?

  • изменить $ stdout?
  • другой

Ответы [ 6 ]

5 голосов
/ 09 декабря 2010

Для чистого раствора 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.

Вместо обезьяны-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, если хотите всегда использовать его.

1 голос
/ 16 декабря 2011

Для рельсов 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 голос
/ 08 декабря 2010

Если это потому, что у вас есть вложенный хеш или что-то, что трудно расшифровать, попробуйте awesome_print. Вы можете сделать это форматером вывода по умолчанию в irb, поместив в ваш .irbrc следующее:

require 'ap'

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

Это упрощает расшифровку объектов с большим количеством данных в IRB.

Даже если вы не используете awesome_print, вы можете обрезать вывод, используя эту же технику, чтобы вам не пришлось переопределять to_s в вашем коде.

1 голос
/ 08 декабря 2010

Если вы просто в IRB - вы можете определить monkeypatch в самом irb и или загрузить файл, который monkeypatches проверяет, через 'load'.Таким образом, вы сохраняете его вне своей базовой базы кода, но все равно получаете функциональность, которая вам необходима, без необходимости переопределять проверку в каждом классе, который вы хотите проверить ....

1 голос
/ 08 декабря 2010

Ваше решение хорошо.

В нем нет тёмной магии, которая может сделать код менее понятным и подверженным ошибкам.

0 голосов
/ 16 декабря 2011

Я иногда изменяю сами объекты (через модуль с именем BoringInspect, который я include, в соответствующие классы), чтобы сообщения об исключениях также были управляемыми.

...