我想截斷irb中的#inspect輸出(大輸出必須被裁剪爲MAX_LEN)。在irb中截斷#inspect輸出(ruby)
目前,我覆蓋:inspect,:所有特定對象的to_s方法。
還有其他解決方案嗎?
- 更改$ stdout?
- 其他?
我想截斷irb中的#inspect輸出(大輸出必須被裁剪爲MAX_LEN)。在irb中截斷#inspect輸出(ruby)
目前,我覆蓋:inspect,:所有特定對象的to_s方法。
還有其他解決方案嗎?
您的解決方案很好。
它不涉及黑暗魔法,這可能會使代碼不易理解並容易出錯。
如果你只是在IRB中 - 你可以在irb本身定義一個monkeypatch,或者加載一個monkeypatches通過'load'檢查的文件。通過這種方式,您可以將其保留在您的核心代碼庫中,但您仍然可以獲得所需的功能,而無需在您希望檢查的每個課程中覆蓋檢查...
如果是因爲您有嵌套散列這很難破譯,請嘗試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。
對於乾淨的解決方案,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。
而不是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,如果你想一直使用它。
鋼軌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
如果您想自定義你的輸出更多,在https://github.com/Ruby/Ruby/blob/trunk/lib/irb.rb
我有時檢查IRB的源修改對象本身(通過一個名爲BoringInspect
的模塊,我將include
轉化爲相關的類),這樣異常消息也是可管理的。
+1 BoringInspect似乎特別適合你;) – horseyguy 2012-01-09 01:08:29