撬检查方法不起作用

时间:2016-04-16 11:49:01

标签: ruby pry

我有了解计算书中的以下代码。目的是改变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。为什么不起作用?

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)

我使用Pry0.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_printpretty_print_cycle 方法,这意味着 Pry 可以按照您想要的方式打印这些方法,而无需覆盖它们的 DEFAULT_PRINT 过程。< /p>