#to_s
est à représentant un objet en tant String
. Dans votre cas, vous devez convertir l'objet à un String
, car String#+
traite seulement String
s. Dans Ruby, les conversions de type sont effectuées avec la forme à trois lettres des méthodes to_X
, c'est-à-dire to_int
, to_ary
, to_hash
(quelqu'un ne peut pas compter jusqu'à trois ...), to_str
et ainsi de suite. Donc, vous devez implémenter to_str
, afin de faire fonctionner cela.
Cependant, vous devez seulement mettre en œuvre to_str
, si votre objet est en fait une chaîne! Si c'est quelque chose d'autre, ne doit pas implémenter to_str
et plutôt avoir les clients explicitement le représenter comme une chaîne en utilisant to_s
.
En fait, la mise en œuvre to_str
en Ruby est comme héritant de String
en Java: cela signifie que A
IS-A String
.
À titre d'exemple, regardez quelles classes dans la bibliothèque de base Ruby réellement mettre en œuvre les méthodes de conversion de type:
- la seule classe qui implémente
to_ary
, est Array
lui-même,
- la seule classe implémente
to_hash
, est Hash
lui-même et
- la seule classe qui implémente
to_str
, est String
lui-même.
Cela devrait vous montrer que la mise en œuvre to_str
est un très affaire sérieuse qui ne devrait pas être pris à la légère.
La seule méthode de conversion qui n'a pas seulement une mise en œuvre sans op trivial, est to_int
, qui est également mis en œuvre par Float
et Numeric
. Et en fait, je pense que c'est une erreur, car il y a un nombre infini de Float
qui ne sont pas Integer
s.Et Numeric
est une superclasse de Integer
, en disant que chaque Numeric
IS-A Integer
est encore plus étrange.
Vous devriez publier votre réponse en tant que vraie réponse, puis l'accepter, de sorte que cette question apparaît dans la liste des questions. – sepp2k