Ruby:调用什么方法?

时间:2010-01-22 20:53:01

标签: ruby object methods override

假设我有一个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...?

2 个答案:

答案 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