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 qu'en rubis je peux faire:
1.9.3p194 :002 > 1.class
=> Fixnum
Mais est-ce la bonne façon de déterminer le type d'objet?
isinstance
ou vérifier les réponses. Mais en disant simplement "NON !!!" n'est pas vraiment utile, maintenant, n'est-ce pas? Pensez plutôt à être éducatif.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
.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 s'ilobject
est de typeClassName
ou dérivé de celui-ci.Normalement, la vérification de type n'est pas effectuée dans Ruby, mais à la place, les objets sont évalués en fonction de leur capacité à répondre à des méthodes particulières, communément appelées " Duck typing ". En d'autres termes, s'il répond aux méthodes que vous souhaitez, 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 chaîne, ou la faire se comporter de la même manière que String se comporte.object.respond_to?(:to_s)
serait une meilleure façon de tester que l'objet en question fait ce que vous voulez.la source
#class
ne renvoie pas le type de l'objet, il renvoie sa classe . Le nom devrait être un cadeau mort. La classe et le type sont deux concepts complètement différents en OO.typeof
de C, JavaScript et autres estclass
. Il n'y a pas de système de protocole formel dans Ruby comme dans d'autres langages, Objective-C étant le parent Smalltalk le plus proche de cela. Si vous définissez "type" comme "objet qui répond à un ensemble particulier de méthodes avec des résultats acceptables", il n'y a vraiment aucun moyen de l'affirmer. C'est tout simplement trop lâche. La plupart du temps en Ruby quand on fait référence au type d'un objet, il est entendu que vous parlez de la classe. J'ai utilisé le terme type entre guillemets pour cette raison.int i
" ou "Integer j
".) Tadman a répondu à la question d'une manière qui semblait satisfaire à la fois le questionneur et le grand public, tout en clarifiant la terminologie utilisée par Ruby. Je n'ai aucun intérêt à me lancer dans la coupe de cheveux académique sur les points les plus fins de la terminologie orientée objet, alors veuillez avoir le dernier mot.vous pouvez également essayer:
instance_of?
la source
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éponde à une certaine méthode. Ceci est connu sous le nom de 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 Duck Typing en utilisant
#respond_to?(method)
:la source
Je dirais "oui". Comme "Matz" avait 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 transmettre. Pourquoi quelqu'un aurait-il alors dit "Tout est un objet"? Pour ajouter, il a dit: "Les données ont des types et non des objets".
Nous pourrions donc en profiter.
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 et non des types. Toutes les données ont alors une classe.
Ils peuvent aussi avoir des ancêtres
Ils ont également des méta-classes mais je vais vous enregistrer 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, la recherche ...
"Le modèle d'objet Ruby"
C'est le terme utilisé pour la façon dont 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 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.
numéros de blocs de texte
la source
Object.ancestors # => [Object, Kernel, BasicObject]