我想在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
我不建议这样做,因为它是一种hack方法,而且每次需要像ap和hirb这样的gems时都会出现问题。
与其对irb进行monkeypatching,我建议尝试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
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
如果您想更多地自定义输出,请查看irb的源代码https://github.com/Ruby/Ruby/blob/trunk/lib/irb.rb
你的解决方案很好。
它不涉及任何黑魔法,这可能会使代码难以理解和容易出错。
如果你只是在IRB中的话,你可以在IRB本身中定义一个monkeypatch,或者加载一个通过“load”monkeypatches inspect的文件。这样你就可以将其从核心代码库中分离出来,但你仍然可以获得所需的功能,而无需在每个你想检查的类中覆盖inspect....
有时我会修改对象本身(通过一个名为BoringInspect
的模块,将其include
到相关类中),以便异常消息也可以管理。