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