Во-первых, ваш класс 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