Détermination du type d'un objet dans ruby

Je vais utiliser python comme exemple de ce que je cherche (Vous pouvez le considérer comme un pseudocode si vous ne connaissez pas Python):

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

Je sais en ruby que je peux faire:

1.9.3p194 :002 > 1.class
 => Fixnum 

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

268
demandé sur Yuxuan Chen 2013-04-02 20:49:26

4 réponses

La bonne façon de déterminer le "type" d'un objet, qui est un terme bancal dans le monde Ruby, est d'appeler object.class.

Étant donné que les classes peuvent hériter d'autres classes, si vous souhaitez déterminer si un objet est d'un type particulier" que l'on pourrait appeler object.is_a?(ClassName) pour voir si object est de type ClassName, ou qui en découlent.

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

Par exemple, object.is_a?(String) est trop rigide car une autre classe peut implémenter des méthodes qui la convertissent en une chaîne, ou la Font se comporter de manière identique à la façon dont la chaîne se comporte. {[5] } serait un meilleur moyen de tester que l'objet en question fait ce que vous voulez.

452
répondu tadman 2017-11-10 21:10:44

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
55
répondu Arup Rakshit 2013-04-02 17:03:58

Souvent dans Ruby, vous ne vous souciez pas réellement de la classe de l'objet, en soi, vous vous souciez juste qu'il répond à une certaine méthode. Ceci est connu comme Duck Typing et vous le verrez dans toutes sortes de bases de code Ruby.

Donc, dans de nombreux cas (sinon la plupart), il est préférable d'utiliser le typage de canard en utilisant #respond_to?(method):

object.respond_to?(:to_i)
34
répondu Stuart M 2013-04-02 16:56:01

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

Donc nous pourrions profiter de cela.

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

Mais Ruby ne se soucie pas beaucoup du type d'objet juste de la classe. Nous utilisons des classes pas type. Toutes les données ont alors une classe.

12345.class

'my string'.class

Ils peuvent aussi avoir des ancêtres

Object.ancestors

Ils ont aussi des classes meta mais je vais vous sauver les détails à ce sujet.

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

"Le Modèle D'Objet Ruby"

C'est le terme utilisé pour la façon dont Ruby gère les objets. Tout est interne donc vous ne voyez pas vraiment une grande partie de cela, mais il est agréable de 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. Donc, si vous connaissez les bases de données, vous savez qu'il n'y a qu'un ensemble fini de types.

Blocs de texte nombres

7
répondu Douglas G. Allen 2017-05-26 21:18:41