我正在使用一个包含大型实例数组的类。
每当我初始化这样的类时,例如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)
。
答案 0 :(得分:8)
此类问题的常见解决方法是在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
答案 1 :(得分:6)
您看到的输出是对象的to_s
(或inspect
)的结果。您可以为类定义/覆盖to_s
(或inspect
)以减少输出。 E.g。
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
通常应该有效。但是,如果类(或其祖先)中有inspect
未调用to_s
,则必须覆盖此inspect
。
答案 2 :(得分:5)
答案 3 :(得分:1)
如果您将Foo.new的返回值更改为 not ,则返回新的Foo对象,您将永远无法将新Foo分配给任何变量。如果唯一的问题是偶尔滚动控制台视图,请使用“; nil”方法。