2010-10-02 7 views
1

J'ai ma classeComment se débarrasser de TypeError


class A 
    def to_s 
    'string' 
    end 
    def inspect 
    'string' 
    end 
end 

et essayer de faire quelque chose comme ça


a = A.new 
'somestring' + a 

erreur est « dans` + ': ne peut pas convertir A en String (TypeError) "

Y at-il un moyen de le réparer?

P.S. utiliser 'somestring' + a.to_s n'est pas une option.

Réponse trouvée. La méthode to_str est nécessaire.

+2

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

Répondre

1

#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.

+0

Symbol implémente également (ou implémenté) 'to_int'. Ne peut pas travailler si c'est un non-op ou non. Si vous faites 'Integer (: yikes)', cela peut être [comportement indésirable] (http://stackoverflow.com/questions/49274/safe-integer-parsing-in-ruby/2551994#2551994)! –

Questions connexes