3

irb で #inspect 出力を切り捨てたい (大きな出力は MAX_LEN にトリミングする必要があります)。

現在、すべての特定のオブジェクトに対して :inspect、:to_s メソッドをオーバーライドしています。

他の解決策はありますか?

  • $stdout を変更しますか?
  • 他の?
4

6 に答える 6

5

クリーンなソリューションの場合、gem install hirb. hirbページ irb の戻り値が長くなりすぎた場合。

irb にモンキーパッチを適用する場合:

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

これはハックであり、ap や hirb などの gem が必要なときに壊れてしまうため、お勧めしません。

irb にモンキーパッチを適用する代わりに、拡張を目的とした irb の代替手段であるriplを試すことをお勧めします。上記の 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

ネストされたハッシュや解読が難しいものが原因である場合は、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 に答える
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

あなたの解決策は良いです。

これには、コードが理解しにくく、エラーが発生しやすくなる可能性のある闇の魔法は含まれていません。

于 2010-12-08T12:45:15.573 に答える
1

IRB だけを使用している場合は、irb 自体でモンキーパッチを定義するか、'load' を介してモンキーパッチが検査するファイルをロードすることができます。このようにして、コアコードベースから除外しますが、検査するすべてのクラスで検査をオーバーライドする必要なく、必要な機能を引き続き取得できます....

于 2010-12-08T12:48:30.383 に答える
0

例外メッセージも管理しやすいように、オブジェクト自体を (関連するクラスに呼び出すモジュールを介して) 変更することBoringInspectがあります。include

于 2011-12-15T22:47:51.677 に答える