【发布时间】:2010-12-08 07:20:14
【问题描述】:
我想在 irb 中截断 #inspect 输出(大输出必须裁剪为 MAX_LEN)。
目前,我为所有特定对象覆盖 :inspect, :to_s 方法。
还有其他解决方案吗?
- 更改 $stdout ?
- 其他?
【问题讨论】:
我想在 irb 中截断 #inspect 输出(大输出必须裁剪为 MAX_LEN)。
目前,我为所有特定对象覆盖 :inspect, :to_s 方法。
还有其他解决方案吗?
【问题讨论】:
对于干净的解决方案,gem install hirb。 hirb pages irb 的返回值,如果它们太长的话。
如果你想对 irb 进行猴子补丁:
module IRB
class Irb
def output_value
@context.last_value.to_s.slice(0, MAX_LEN)
end
end
end
我不建议这样做,因为它是一种 hack,并且在需要 ap 和 hirb 之类的宝石时会损坏。
我建议您尝试ripl,而不是monkeypatching irb,这是一种旨在扩展的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 本身中定义一个猴子补丁,或者加载一个文件,猴子补丁通过“加载”进行检查。通过这种方式,您可以将其排除在核心代码库之外,但您仍然可以获得所需的功能,而无需在您希望检查的每个类中覆盖检查......
【讨论】:
如果是因为您有嵌套的哈希或难以破译的东西,请尝试 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
如果您想更多地自定义输出,请查看 irb 的源代码https://github.com/Ruby/Ruby/blob/trunk/lib/irb.rb
【讨论】:
我有时会修改对象本身(通过一个名为 BoringInspect 的模块将其 include 放入相关类中),以便也可以管理异常消息。
【讨论】: