2010-01-22 5 views
0

Supposons que j'ai un objet x de MyClass. Quelle méthode est appelée, quand je fais puts x? Je dois le remplacer par le mien.Ruby: quelle méthode est appelée?

Je pensais que c'était .inspect, mais d'une certaine manière inspect n'est pas appelée.

Par exemple, j'ai une classe Sum:

class Sum 
    initiazlie a, b 
    @x = a + b 
    end 
end 

Et je veux accéder au résultat comme ceci:

s = Sum.new(3,4) 
puts s   #=> 7 How do I do this? 
puts 10 + s #=> 17 or even this...? 

Répondre

4

Il appelle: to_s

class Sum 
    def to_s 
    "foobar" 
    end 
end 

puts Sum.new #=> 'foobar' 

Ou si vous vouloir, vous pouvez simplement appeler inspect de to_s, afin que vous ayez une représentation de chaîne cohérente de votre objet.

class Sum 
    def to_s 
    inspect 
    end 
end 
3

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 
Questions connexes