我正在使用一个包含大型实例数组的类.
每当我初始化这样的一类,例如i = Image.new,我从我的阵列中大量的垃圾输出(@r,@g,@b-每个〜300K值).
class Image
def initialize(width=640, height=480, brightness=64)
@width, @height, @brightness = width, height, brightness
self.load('usart.dat')
end
def load(file='usart.dat')
self.reset
f = IO.read(file, @height * @width * 2, 0)
# Parsing the datafile, saving data in @r, @g, @b, @gray etc
end
return self
end
# ... More methods
end
Run Code Online (Sandbox Code Playgroud)
问题是,我怎样才能使输出静音(所有结果都保存到文件中,从不在控制台中查看)或者使初始化程序不检查自身.我想返回self,因为我想要堆叠方法,例如image.load('file').binary.grayscale.save(:bin).
此类问题的常见解决方法是仅添加; nilIRB,例如i = Image.new ; nil.这样,最后评估的表达式nil也将被返回.
>> Foo.new
=> #<Foo:0x00000000e3b9d0 @a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>
>> Foo.new ; nil
=> nil
Run Code Online (Sandbox Code Playgroud)
您看到的输出是对象to_s(或inspect)的结果.您可以为类定义/覆盖to_s(或inspect)以产生较少的输出.例如
irb(main):001:0> class Foo
irb(main):002:1> def initialize
irb(main):003:2> @a = @b = @c = @d = 42
irb(main):004:2> end
irb(main):005:1>
irb(main):006:1* def to_s
irb(main):007:2> 'a Foo object'
irb(main):008:2> end
irb(main):009:1> end
=> nil
irb(main):010:0> h = Foo.new
=> a Foo object
irb(main):011:0>
Run Code Online (Sandbox Code Playgroud)
关于to_s/ inspect:inspect通常只调用的irb调用to_s(参见ruby-doc).因此,定义to_s应该正常工作.但是,如果在类(或其祖先)中inspect没有调用to_s,则inspect必须覆盖它.
禁用irb回显:
conf.echo = false
Run Code Online (Sandbox Code Playgroud)
gem utility_belt将为您提供命令quiet并verbose禁用/启用输出(以及更多).