irb で #inspect 出力を切り捨てたい (大きな出力は MAX_LEN にトリミングする必要があります)。
現在、すべての特定のオブジェクトに対して :inspect、:to_s メソッドをオーバーライドしています。
他の解決策はありますか?
- $stdout を変更しますか?
- 他の?
クリーンなソリューションの場合、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 に追加したりできます。
ネストされたハッシュや解読が難しいものが原因である場合は、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 をオーバーライドする必要はありません。
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 のソースを確認してください。
あなたの解決策は良いです。
これには、コードが理解しにくく、エラーが発生しやすくなる可能性のある闇の魔法は含まれていません。
IRB だけを使用している場合は、irb 自体でモンキーパッチを定義するか、'load' を介してモンキーパッチが検査するファイルをロードすることができます。このようにして、コアコードベースから除外しますが、検査するすべてのクラスで検査をオーバーライドする必要なく、必要な機能を引き続き取得できます....
例外メッセージも管理しやすいように、オブジェクト自体を (関連するクラスに呼び出すモジュールを介して) 変更することBoringInspect
があります。include