假设我有一个x
的对象MyClass
。当我puts x
时,会调用什么方法?我需要用我自己的覆盖它。
我认为它是.inspect
,但某些被覆盖的inspect
未被调用。
例如,我有一个班级Sum
:
class Sum
initiazlie a, b
@x = a + b
end
end
我想要像这样访问结果:
s = Sum.new(3,4)
puts s #=> 7 How do I do this?
puts 10 + s #=> 17 or even this...?
答案 0 :(得分:4)
它呼叫:to_s
class Sum
def to_s
"foobar"
end
end
puts Sum.new #=> 'foobar'
或者,如果您愿意,可以从inspect
拨打to_s
,以便您拥有对象的一致字符串表示。
class Sum
def to_s
inspect
end
end
答案 1 :(得分:3)
首先,您的Sum类无效。定义应该是。
class Sum
def initialize(a, b)
@x = a + b
end
end
默认情况下,调用获取人类可读表示的方法是inspect。请在irb
$ s = Sum.new(3, 4)
# => #<Sum:0x10041e7a8 @x=7>
$ s.inspect
# => "#<Sum:0x10041e7a8 @x=7>"
但在您的情况下,您使用强制字符串转换的puts
方法。因此,Sum
对象首先使用to_s
方法转换为字符串。
$ s = Sum.new(3, 4)
# => #<Sum:0x10041e7a8 @x=7>
$ puts s
# => #<Sum:0x10041e7a8>
$ puts s.to_s
# => #<Sum:0x10041e7a8>
另请注意,您的上一个示例属于第三种情况。因为你将Fixnum +另一个对象相加,结果应该是一个Fixnum,并且调用的方法是to_s
,但是在Fixnum类中定义的方法。
为了在Sum类中使用它,您需要切换总和中的项目并在对象中定义+
。
class Sum
def initialize(a, b)
@x = a + b
end
def +(other)
@x + other
end
def to_s
@x.to_s
end
end
s = Sum.new(3, 4)
s + 10
puts s
# => 17