如何让Ruby对象的指定属性在inspect输出中隐藏?
解决Ruby中inspect输出隐藏大数组属性的问题
我习惯用Ruby的inspect方法调试,但我的某个类里包含一个有6000+元素的数组,每次执行puts obj.inspect时,这个数组会占大量屏幕空间。有没有办法让这个数组属性在inspect输出里隐藏?
以下是几个可行的解决方案:
方法1:自定义myinspect方法
手动构造符合Ruby默认inspect格式的字符串,仅包含需要展示的实例变量:
class Test def initialize @x = 1 @array = [1, 2, 3, 4, 5, 6, 7, 8, 9] end def myinspect addr = object_id.to_s(16) attrs = "@x=#{@x.inspect}" "<Test:0x#{addr} #{attrs}>" end end c = Test.new puts c.inspect # <Test:0x00007f1d49e33b00 @x=1, @array=[1, 2, 3, 4, 5, 6, 7, 8, 9]> puts c.myinspect # <Test:0x00007f1d49e33b00 @x=1>
方法2:重写默认inspect方法
如果希望默认的inspect行为就隐藏指定数组,直接重写该方法即可:
class Test def initialize @x = 1 @array = [1, 2, 3, 4, 5, 6, 7, 8, 9] end def inspect # 过滤掉不需要展示的实例变量 filtered_vars = instance_variables.reject { |var| var == :@array } # 转换为标准的属性字符串格式 attrs = filtered_vars.map { |var| "#{var}=#{instance_variable_get(var).inspect}" }.join(', ') "#<#{self.class}:0x#{object_id.to_s(16)} #{attrs}>" end end c = Test.new puts c.inspect # <Test:0x00007f1d49e33b00 @x=1>
方法3:借助PP模块自定义格式化
如果需要更灵活的输出格式,可使用Ruby内置的PP模块(Pretty Print):
require 'pp' class Test def initialize @x = 1 @array = [1, 2, 3, 4, 5, 6, 7, 8, 9] end def pretty_print(pp) pp.object_group(self) do pp.breakable pp.text "@x=#{@x.inspect}" # 若需要显示数组,取消下面一行注释即可 # pp.text ", @array=#{@array.inspect}" end end end c = Test.new pp c # 输出仅包含@x的内容
内容的提问来源于stack exchange,提问作者jvx8ss
相关产品推荐
相关产品推荐

