Ruby:覆盖puts方法

我有一个小程序打算在IRB中运行。 它最终输出的东西看起来像一个数组,虽然技术上不是一个数组。 (该类inheritance自数组。)问题是,当我执行此类的实例时,例如example = Awesome.new(1,2,3),并且我写了“puts example”,IRB的默认行为是将每个示例元素在它自己的行上。

而不是

[1,2,3] 

(这就是我想要的),IRB弹出这个。

 1 2 3 

是否有一种智能方法可以覆盖此特殊类的puts方法? 我尝试过这个,但它没有用。

 def puts self.to_a end 

知道我做错了什么吗?

更新:所以我尝试了这个,但没有成功。

 def to_s return self end 

因此,当我在IRB并且我只输入“示例”时,我得到了我正在寻找的行为(即[1,2,3]。所以我想我可以回归自我,但我仍然在搞乱显然,某些东西。我不理解什么?

 def puts(o) if o.is_a? Array super(o.to_s) else super(o) end end puts [1,2,3] # => [1, 2, 3] 

或者只是使用p

 p [1, 2, 3] # => [1, 2, 3] 

你应该覆盖to_s并且它将被自动处理,只记得从to_s返回一个字符串,它将作为一个魅力。


示例摘录..

 class Obj def initialize(a,b) @val1 = a @val2 = b end def to_s "val1: #@val1\n" + "val2: #@val2\n" end end puts Obj.new(123,321); 

 val1: 123 val2: 321 

你可能最好为类似数组的类实现to_ary方法。 puts将调用此方法以获取所有元素。 我在下面的一个项目中发布了一个片段

 require 'forwardable' class Path extend Forwardable def_delegators :@list, :<<, :count, :include?, :last, :each_with_index, :map def initialize(list = []) @list = list end def to_ary self.map.each_with_index{ |e, i| "#{e}, step: #{i}" } end end