我正在处理一个包含大型实例数组的类。
每当我像这样初始化一个类时,例如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
问题是,我如何能够沉默输出(所有结果保存到一个文件,从未在控制台查看)或使初始化器不检查自我。我想返回self
,因为我想堆栈方法,例如image.load('file').binary.grayscale.save(:bin)
.
解决这类问题的常见方法是在IRB中添加; nil
,例如i = Image.new ; nil
。这样,最后求值的表达式是nil
,它也将返回。
>> Foo.new
=> #<Foo:0x00000000e3b9d0 @a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>
>> Foo.new ; nil
=> nil
您看到的输出是您的对象的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>
关于to_s
/inspect
: irb调用inspect
,通常只调用to_s
(参见ruby-doc)。因此,定义to_s
应该正常工作。但是,如果在类(或其祖先类)中存在没有调用to_s
的inspect
,则必须覆盖此inspect
。
禁用irb返回:
conf.echo = false
gem utility_belt会给你quiet
和verbose
命令来禁用/启用输出(以及更多)。
如果您更改Foo的返回值。new to not返回新的Foo对象,您将永远无法将新的Foo分配给任何变量。如果唯一关心的是偶尔滚动控制台视图,则使用";nil"方法。