我想截断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