IRB用什么来确定如何表示返回的实例?

时间:2014-02-27 13:54:10

标签: ruby class irb

给出一个Ruby类:

class Foo
  def initialize(options={})
    @sensitive = options.delete :sensitive
  end
end

如果我在IRB中创建该类的实例,我会看到实例变量和内存地址。

irb(main):002:0> Foo.new(sensitive: 'foo')
=> #<Foo:0x007fe766134a98 @sensitive="foo">

如果我创建AWS :: S3的实例,我不会:

irb(main):003:0> require 'aws-sdk'
=> true
irb(main):004:0> AWS::S3.new(access_key_id: 'aki', secret_access_key: 'sak')
=> <AWS::S3>

请注意,AWS::S3不是单身人士(至少不是explicitly including the Singleton module意义上的。)

我能告诉IRB不输出实例变量和/或内存地址吗?

(我已经尝试了.to_s但是我得到一个字符串,其中包含两个类的实例的内存地址,没有任何实例变量。)

2 个答案:

答案 0 :(得分:3)

如果您启动 IRB irb --noecho,则会取消所有IRB检查。但我认为这不是你的问题。

IRB使用#inpect方法。阅读文档中的一行:

返回包含人类可读表示obj的字符串。 默认情况下,显示类名称以及实例变量及其值的列表(通过在每个上调用inspect)。用户定义的类应该重写此方法以更好地表示obj 。当覆盖此方法时,它应返回字符串,其编码与默认外部编码兼容。

示例:

class Foo
   def initialize
      @x = 10
   end
   # customized inspection
   def inspect
    "0x%7x" % self.object_id.to_s
   end
end

foo = Foo.new
foo # => 0x118e27c

注意:我在自定义的#inspect方法中使用了String#%方法。

答案 1 :(得分:2)

用于呈现人类可读的调试输出的标准方法(不仅在IRb中,但通常在例如Rails错误页面等上)是#inspect。根据您加载的扩展名,命令行选项或者您是否使用Pry而不是IRb,它也可能首先查找#pretty_inspect