我有了解计算书中的以下代码。目的是改变inspect
行为。
class Number < Struct.new(:value)
def inspect
"<<#{self}>>"
end
def to_s
value.to_s
end
end
当我使用irb
时,它按预期工作:
irb(main):014:0> Number.new(1)
=> <<1>>
但是当我使用pry
:
[8] pry(main)> n = Number.new(1)
=> #<struct Number value=1>
Pry是Ruby 2.0.0上的版本0.10.3。为什么不起作用?
答案 0 :(得分:4)
Pry不只是使用"I shoot someone using ak47 and m4s times"
来显示返回值。它调用在配置中定义的名为 print object 的proc。在inspect
中,您可以找到它设置为:
lib/pry.rb
要在class Pry
# The default print
DEFAULT_PRINT = proc do |output, value, _pry_|
_pry_.pager.open do |pager|
pager.print _pry_.config.output_prefix
Pry::ColorPrinter.pp(value, pager, Pry::Terminal.width! - 1)
end
end
end
中使用inspect
,请按照指示here进行设置:
irb
然后你会得到:
Pry.config.print = proc {|output, value| output.puts "=> #{value.inspect}"}
答案 1 :(得分:0)
我使用Pry
版0.10.4
。
我刚刚在我的.pryrc
文件中添加了以下几行(我认为这是好
这样的代码的地方):
if defined?(BigDecimal)
BigDecimal.class_eval do
def inspect
"<#{to_s('+3F')}>"
end
end
end
结果:
balance: <+100.0>,
commission_amount: <+0.15>
答案 2 :(得分:0)
Sawa 是对的,因为 Pry 使用自己的打印机,但是如果您仔细观察 source,您会发现它实际上在幕后使用了 Ruby 的 PP
,而 PP
定义了它的 own behaviour 用于漂亮的打印结构:
class Struct # :nodoc:
def pretty_print(q) # :nodoc:
q.group(1, sprintf("#<struct %s", PP.mcall(self, Kernel, :class).name), '>') {
q.seplist(PP.mcall(self, Struct, :members), lambda { q.text "," }) {|member|
q.breakable
q.text member.to_s
q.text '='
q.group(1) {
q.breakable ''
q.pp self[member]
}
}
}
end
def pretty_print_cycle(q) # :nodoc:
q.text sprintf("#<struct %s:...>", PP.mcall(self, Kernel, :class).name)
end
end
如果您有兴趣了解更多信息,值得查看 documentation(虽然它只是简短的)。
因此,在您的结构中,您还可以定义自己的 pretty_print
和 pretty_print_cycle
方法,这意味着 Pry 可以按照您想要的方式打印这些方法,而无需覆盖它们的 DEFAULT_PRINT
过程。< /p>