452 votes

Détermination du type d'un objet en ruby

Je vais utiliser Python comme exemple de ce que je recherche (vous pouvez l'imaginer comme un pseudocode si vous ne connaissez pas Python) :

>>> a = 1
>>> type(a)
<type 'int'>

Je sais qu'en ruby je peux faire :

1.9.3p194 :002 > 1.class
 => Fixnum 

Mais est-ce la bonne façon de déterminer le type d'objet ?

0 votes

Oui1 en ruby c'est le chemin <object name>.class .

0 votes

@iAmRubuuu : Non, ça ne l'est pas. #class renvoie le classe et non le type . C'est pourquoi il est appelé #class après tout. Le PO a demandé le type, pas la classe. Ces deux éléments sont complètement différents.

0 votes

@DaveNewton : Le PO a demandé le type, pas la classe. Ces deux éléments sont complètement différents. #class renvoie le classe et non le type .

726voto

tadman Points 70178

La manière correcte de déterminer le "type" d'un objet, qui est un terme bancal dans le monde Ruby, est d'appeler object.class .

Puisque les classes peuvent hériter d'autres classes, si vous voulez déterminer si un objet est "d'un type particulier", vous pouvez appeler object.is_a?(ClassName) pour voir si object est de type ClassName ou dérivé de celui-ci.

Normalement, la vérification des types n'est pas effectuée en Ruby, mais les objets sont évalués en fonction de leur capacité à répondre à des méthodes particulières, communément appelées " Dactylographie du canard ". En d'autres termes, s'il répond aux méthodes que vous souhaitez, il n'y a aucune raison d'être particulier quant au type.

Par exemple, object.is_a?(String) est trop rigide, car une autre classe pourrait implémenter des méthodes qui le convertissent en chaîne de caractères, ou le font se comporter de manière identique à String. object.respond_to?(:to_s) serait un meilleur moyen de tester que l'objet en question fait ce que vous voulez.

17 votes

-1. #class hace no renvoie le type de l'objet, il renvoie son classe . Le nom devrait vous mettre la puce à l'oreille. La classe et le type sont deux complètement différents concepts dans l'OO.

99 votes

@Jörg W Mittag : Je ne suis pas d'accord. "Classe" et "vitesse du processeur" (pour prendre un exemple) sont deux concepts complètement différents, mais "classe" et "type" sont des concepts étroitement liés. Par exemple, voici ce que l'article de Wikipédia sur la classe dit : "En programmation orientée objet, une classe est une construction qui est utilisée pour définir un type distinct." tadman a été utile à l'auteur de la question.

1 votes

@TeemuLeisti : Cette information est tout simplement fausse. Les classes définissent Représentations Les protocoles définissent Types . La caractéristique déterminante de l'orientation objet est qu'un même type peut avoir plusieurs représentations, c'est-à-dire qu'un même protocole peut être fourni par plusieurs classes. Par exemple, en Ruby, la classe IO type est mis en œuvre à la fois par l IO classe et le StringIO classe . Le site Enumerable type a une seule méthode each alors que le Enumerable classe (en fait mixin ) a toutes les méthodes sauf each .

103voto

Arup Rakshit Points 50675

Vous pouvez également essayer : instance_of?

p 1.instance_of? Fixnum    #=> True
p "1".instance_of? String  #=> True
p [1,2].instance_of? Array #=> True

51voto

Stuart M Points 5635

Souvent, en Ruby, on ne se soucie pas vraiment de la classe de l'objet, en soi, mais simplement qu'il réponde à une certaine méthode. C'est ce qu'on appelle Dactylographie du canard et vous le verrez dans toutes sortes de bases de code Ruby.

Ainsi, dans de nombreux cas (si ce n'est la plupart), il est préférable d'utiliser Duck Typing en utilisant #respond_to?(method) :

object.respond_to?(:to_i)

1 votes

Point valable. ne répond pas à la question mais touche l'esprit de la question.

2 votes

@user566245 Eh bien, il répond_to ?(:the_question), mais comme vous l'avez dit, il ne répond pas à la question, il donne juste des informations connexes. Je suis presque sûr que les réponses doivent répondre à la question.

31voto

Douglas G. Allen Points 359

Je dirais "Oui". Comme "Matz" a dit quelque chose comme ça dans une de ses conférences, "Les objets Ruby n'ont pas de types." Pas tout, mais la partie qu'il essaie de nous faire comprendre. Pourquoi quelqu'un aurait-il dit "Tout est un objet" alors ? Pour ajouter, il a dit "Les données ont des types, pas des objets".

Donc nous pourrions apprécier ceci.

https://www.youtube.com/watch?v=1l3U1X3z0CE

Mais Ruby ne se soucie guère du type d'objet, juste de la classe. Nous utilisons des classes et non des types. Toutes les données ont donc une classe.

12345.class

'my string'.class

Ils peuvent également avoir des ancêtres

Object.ancestors

Ils proposent également des cours de méta, mais je vous épargne les détails à ce sujet.

Une fois que vous connaissez la classe, vous serez en mesure de rechercher les méthodes que vous pouvez utiliser pour elle. C'est là que le "type de données" est nécessaire. Si vous voulez vraiment entrer dans les détails, la recherche...

"Le modèle objet Ruby"

C'est le terme utilisé pour désigner la façon dont Ruby gère les objets. Tout est interne, donc vous n'en verrez pas beaucoup, mais c'est bon à savoir. Mais c'est un autre sujet.

Oui ! La classe est le type de données. Les objets ont des classes et les données ont des types. Si vous connaissez les bases de données, vous savez qu'il n'existe qu'un nombre limité de types.

blocs de texte numéros

4voto

Nom_variable.classe

Ici le nom de la variable est "a" a.class

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X