在自定义Ruby类中,如何定义实例的默认表示?

时间:2013-11-06 03:00:03

标签: ruby

我希望我的自定义类的实例具有与其超类相同的方法和行为,除非在其上调用返回某些内容的特定方法(如next,它返回下一个Numeric in序列)。在这种情况下,它应该像String一样行动。

class MyNumber < Numeric
  ...
end

val = MyNumber.new(1)
# acts like a regular Numeric

val.next
#=> 2

val
#=> "Hello 2!"

puts "Hey #{val}"
#=> "Hey Hello 2!"

在上面的情况中,我想我会重新定义to_s

1 个答案:

答案 0 :(得分:1)

您在该类上定义inspect方法。例如,如果您将String#inspect修改为:

class String
  def inspect; self * 2 end
end

然后你得到:

"Hello" # => "HelloHello"

我想你想要这个:

class MyNumber < Numeric
  def inspect; "Hey #{self}" end
end

请注意,插值"#{}"使用to_s而非inspect,因此不会导致无限递归。