Ruby:覆盖puts方法

时间:2012-07-13 03:51:08

标签: ruby irb

我有一个小程序打算在IRB中运行。它最终会输出看起来像数组的东西,虽然技术上不是数组。 (该类继承自数组。)问题是,当我执行此类的实例时,例如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并且只输入“example”时,我得到了我正在寻找的行为(即[1,2,3]。所以我想我可以回归自我,但我'显然,我还在弄乱一些东西。我不理解什么?

3 个答案:

答案 0 :(得分:5)

您应该覆盖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

答案 1 :(得分:4)

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] 

答案 2 :(得分:1)

您可能最好为类似数组的类实现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