6

我有一个打算在 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 中并且我只是输入“示例”时,我得到了我正在寻找的行为(即 [1, 2, 3]。所以我想我可以只返回自我,但我仍然在搞砸显然,我有什么不明白的?

4

3 回答 3

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
于 2012-07-13T03:54:28.327 回答
5
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] 
于 2012-07-13T05:43:33.353 回答
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 
于 2014-06-01T01:21:23.170 回答