我有一个小程序打算在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]。所以我想我可以回归自我,但我'显然,我还在弄乱一些东西。我不理解什么?
答案 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