D'abord, votre classe Sum n'est pas valide. La définition devrait être.
class Sum
def initialize(a, b)
@x = a + b
end
end
Par défaut, la méthode appelée pour obtenir une représentation lisible par un humain est inspectée. Essayez ceci dans irb
$ s = Sum.new(3, 4)
# => #<Sum:0x10041e7a8 @x=7>
$ s.inspect
# => "#<Sum:0x10041e7a8 @x=7>"
Mais dans votre cas, vous utilisez la méthode puts
qui force une conversion de chaîne. Pour cette raison, l'objet Sum
est d'abord converti en chaîne à l'aide de la méthode to_s
.
$ s = Sum.new(3, 4)
# => #<Sum:0x10041e7a8 @x=7>
$ puts s
# => #<Sum:0x10041e7a8>
$ puts s.to_s
# => #<Sum:0x10041e7a8>
Notez également que votre dernier exemple tombe dans un troisième cas. Puisque vous additionnez un Fixnum + un autre objet, le résultat devrait être un Fixnum et la méthode appelée est to_s
mais celle définie dans la classe Fixnum. Pour utiliser celui de votre classe Sum, vous devez changer les éléments de la somme et définir le +
dans votre objet.
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