给出一个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
但是我得到一个字符串,其中包含两个类的实例的内存地址,没有任何实例变量。)
答案 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
。