2010-12-08 4 views
3

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

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

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

  • изменить $ stdout?
  • прочее?

ответ

1

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

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

1

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

1

Если это потому, что у вас есть вложенный хэш или что-то еще это трудно расшифровать, попробуйте 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 в вашем коде.

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 

Я не рекомендую это, потому что это хак и ломает любые временные драгоценные камни, как требуется ар и 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, если вы хотите, чтобы всегда использовать его.

1

Для рельсов 3.1.1+, поместите следующий код в хелперов/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

0

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

+0

+1 BoringInspect кажется особенно подходящим для вас;) – horseyguy 2012-01-09 01:08:29