我想截断 irb 中的#inspect 输出(必须将大输出裁剪为 MAX_LEN)。
目前,我为所有特定对象覆盖 :inspect, :to_s 方法。
还有其他解决方案吗?
- 更改 $stdout ?
- 其他?
对于干净的解决方案,gem install hirb
. hirb页面 irb 的返回值,如果它们变得太长。
如果你想monkeypatch 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 中。
你的解决方案很好。
它不涉及黑魔法,这可能会使代码难以理解且容易出错。
如果您只是在 IRB 中 - 您可以在 irb 本身中定义一个猴子补丁,或者加载一个文件,猴子补丁通过“加载”进行检查。通过这种方式,您可以将其排除在核心代码库之外,但您仍然可以获得所需的功能,而无需在您希望检查的每个类中覆盖检查......
对于 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 的源代码
如果是因为你有一个嵌套的散列或一些难以破译的东西,试试 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。
我有时会修改对象本身(通过BoringInspect
我将其include
放入相关类的模块),以便也可以管理异常消息。