web-dev-qa-db-fra.com

Détermination du type d'un objet dans ruby

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

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

Je sais que dans Ruby 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?

319
Zippy Zeppoli

La manière appropriée de déterminer le "type" d'un objet, qui est un terme instable dans le monde Ruby, consiste à appeler object.class.

Comme 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 il.

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 " typage de canard ". En d’autres termes, s’il répond aux méthodes que vous souhaitez, il n’ya 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 chaîne ou la fait se comporter de manière identique à celle de String. object.respond_to?(:to_s) serait un meilleur moyen de vérifier que l'objet en question fait ce que vous voulez.

533
tadman

vous pouvez aussi essayer: instance_of?

_p 1.instance_of? Fixnum    #=> True
p "1".instance_of? String  #=> True
p [1,2].instance_of? Array #=> True
_
71
Arup Rakshit

Souvent, dans Ruby, vous ne vous souciez pas vraiment de la classe de l'objet, mais vous vous souciez simplement qu'il réponde à une certaine méthode. Cela s'appelle Duck Typing et vous le verrez dans toutes sortes de bases de code Ruby.

Donc, dans beaucoup (sinon la plupart) des cas, il est préférable d’utiliser Duck Typing en utilisant #respond_to?(method) :

object.respond_to?(:to_i)
40
Stuart M

Je dirais "oui". Comme "Matz" avait dit quelque chose comme ceci 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 comprendre. Pourquoi quelqu'un aurait dit "Tout est un objet" alors? Il a ajouté "Les données ont des types et non des objets".

Donc, nous pourrions profiter de cela.

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

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

12345.class

'my string'.class

Ils peuvent aussi avoir des ancêtres

Object.ancestors

Ils ont également des méta-cours, mais je vais vous garder les détails à ce sujet.

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

"Le modèle d'objet Ruby"

C'est le terme utilisé pour savoir comment Ruby gère les objets. Tout est interne, vous ne voyez donc pas grand-chose, mais c'est agréable à savoir. Mais c'est un autre sujet.

Oui! La classe est le type de données. Les objets ont des classes et les types de données. Donc, si vous connaissez les bases de données, vous savez qu’il n’ya qu’un ensemble fini de types.

nombre de blocs de texte

14
Douglas G. Allen