2009-05-06 8 views
40

Quelle est la différence entre les méthodes de classe et de type dans Ruby? J'ai remarqué que ce type fonctionne pour trouver le type de certaines classes mais pas d'autres.class() vs type() dans Ruby

Répondre

48

La principale différence est que Object#type est dépréciée. À partir du RDoc pour le type d'objet #:

Le synonyme obsolète de la classe Object #.

Voici pourquoi vous devez utiliser Object#class:

Renvoie la classe de obj, maintenant préféré sur l'objet # type, comme le type d'objet en Ruby est seulement vaguement lié à cet objet la classe. Cette méthode doit toujours être appelée avec un récepteur explicite , car la classe est également un mot réservé dans Ruby.

En réalité, vous souhaitez probablement utiliser Object#respond_to? au lieu de vérifier la classe d'un objet dans la plupart des cas.

+0

Si c'est un synonyme, pourquoi aurais-je une erreur de méthode non définie quand j'appelle type sur un cours que j'ai défini moi-même? Mais la même chose n'arrive pas quand j'appelle la méthode de classe pour la même classe. Une erreur de méthode non définie ne ressemble pas à ce que vous obtiendriez pour une méthode obsolète. –

+0

@Chris Collins je suppose que le doc est éteint, et que ce n'est pas un synonyme strict. Le point reste que le type d'objet est une méthode sans utilisation. – runako

+4

Pourquoi utiliser respond_to? –

15

#type est un synonyme de #class, mais il est déprécié en rubis 1.8, et apparemment disparu de ruby ​​1.9. Il suffit d'utiliser #class partout.

 

# For ruby 1.8 

$ ri Object#type 
------------------------------------------------------------ Object#type 
    obj.type => class 
------------------------------------------------------------------------ 
    Deprecated synonym for Object#class. 


# For ruby 1.9 

$ ri1.9 Object#type 
Nothing known about Object#type 
+0

Si c'est un synonyme, pourquoi aurais-je une erreur de méthode non définie quand j'appelle type sur un cours que j'ai défini? Mais la même chose n'arrive pas quand j'appelle la méthode de classe pour la même classe. Une erreur de méthode non définie ne ressemble pas à ce que vous obtiendriez pour une méthode obsolète. –

+0

Êtes-vous sur ruby ​​1.9? Sur ruby ​​1.8 je ne reçois pas d'erreur, juste un avertissement sur la dépréciation. – kch

+0

Et si vous êtes sur ruby ​​1.9, eh bien, dépréciation signifie qu'il sera supprimé quand, et ressemble à 1.9 est ce quand. – kch