68 votes

Folie Ruby: Classe vs Objet?

J'ai juste commencé à jouer avec JRuby. C'est ma première ruby post. J'ai eu du mal à comprendre classes vs objets en Ruby. Il ne signifie pas que comme ce que les classes et les objets des autres orientée Objet de langues. pour un exemple

Class.is_a? Object

retourne true et

Object.is_a? Object

trop.

tellement de classe et d'Objet sont à la fois des objets

voici un autre

Class.is_a? Class

retourne true et

Object.is_a? Class

trop.

attendez, je ne suis pas encore fait

 Object.instance_of? Class
 Class.instance_of? Class

Les deux sont vrais

 Object.instance_of? Object
 Class.instance_of? Object

Les deux sont fausses. droit, rien ne peut être instance de l'objet.

Et

 Class.kind_of? Class
 Object.kind_of? Class

les deux sont vrais

 Class.kind_of? Object
 Object.kind_of? Object

les deux sont vrais

Donc les deux sont exactement les mêmes, alors, pourquoi avons-nous ces deux.?

Après quelques plus de creuser, j'ai écrit cette simple méthode pour retourner la liste de méthodes prises en charge par les deux

irb(main):054:0> def print_methods(obj)
irb(main):055:1>    obj.methods.each do |mm|
irb(main):056:2*        puts mm
irb(main):057:2>    end
irb(main):058:1> end

Seule la méthode de la différence entre print_methods(Objet) et print_methods(Classe) est

     Nesting

si l'Imbrication signifie l'héritage, l'Objet Est similaire à la classe scellée??

Quelqu'un peut-il me préciser ce qui est tout cela?

Mise à jour: À Jed commentaire

Il est intéressant de noter, je vois beaucoup de différences dans la méthode de la liste dans

c=Class.new
print_methods(c)

et

o=Object.new
print_methods(o)

Maintenant, je comprends Instance d'une classe est vraiment une instance de classe (Et cette instance de classe est en fait un Objet) pas une instance d'objet. Et même en ce cas permettez-moi de durée un autre cas

  xx = c.new //works - c is an Object / and xx is a instance of an Object c
  yy = o.new //nope  - o is already a instance of an Object, so it cannot be instantiated again

Donc, Finalement, l'Objet est vraiment une instance d'une Classe. Parce que

  xx.is_a? Class 

est faux, mais

  xx.is_a? Object 

retourne true

Suis-je en droit, ??

39voto

sepp2k Points 157757

Fondamentalement, l'essentiel à comprendre est que chaque classe est une instance de l' Class de la classe et de chaque classe est une sous-classe de la Object (1.8 - 1.9 chaque classe est une sous-classe de la BasicObject). Ainsi, chaque classe est un objet dans le sens qu'il est une instance d'une sous-classe de la Object, c'est à dire Class.

Bien sûr, cela signifie qu' Class est une instance de lui-même. Si cela rend votre cerveau blessé, il suffit de ne pas réfléchir trop profondément.

Object et Class sont is_a? Object

x.is_a? y retours true si x.class == y or x.class < y, c'est à dire si x'classe s est y ou x'classe hérite de y. Car chaque classe hérite de l'objet x.is_a? Object retourne vrai, n'importe quel x . (1,8 toute façon, dans l'1.9 il y a aussi BasicObject qui est maintenant le plus classe de base dans la hiérarchie d'héritage).

Ils sont également is_a? Class

Les deux Object et Class sont en effet classes, ce qui ne devrait pas être surprenant.

Ils sont également instance_of? Class, mais pas instance_of? Object.

Contrairement aux is_a?, x.instance_of? y seulement renvoie true si x.class == y, pas si x.class est une sous-classe de y. Donc, puisque les deux x et y sont instance_of? Class, ils ne sont pas instance_of? Object.

droit, rien ne peut être instance de l'objet.

Ce n'est pas vrai. Object.new.instance_of? Object est vrai.

kind_of?

kind_of? est un alias pour is_a?, voir ci-dessus.

Donc les deux sont exactement les mêmes, alors, pourquoi avons-nous ces deux.?

Il convient de rappeler que tout ce qui jusqu'à maintenant est vrai pour toutes les classes. E. g. String.is_a? Object, String.is_a? Class et String.instance_of? Class sont vraies et String.instance_of? Object est faux pour les mêmes raisons que ci-dessus. (Également String.is_a? String et String.instance_of? String sont faux, pour les mêmes raisons - String est une classe, pas une chaîne de caractères).

Vous ne pouvez pas conclure que toutes les classes sont les mêmes. Ils sont juste toutes les instances de la même classe.

La comparaison des méthodes

Depuis les deux Object et Class sont des classes, ils ont tous les deux toutes les méthodes d'instance définie par Class. Class , de surcroît, le singleton méthode nesting. nesting vous indique le module que vous êtes en train de imbriquées, il n'a rien à voir avec l'héritage.

Pour une classe TheClass.methods sera de retour l'instance méthodes définies par Class (par exemple, superclass, ce qui renvoie à la classe qui TheClass hérite de, et new qui crée une nouvelle instance de l' TheClass) plus le singleton méthodes définies par la classe.

De toute façon, methods ne vous raconte pas les méthodes qui peuvent être appelées directement sur un objet donné. Il ne vous indique pas les méthodes qui peuvent être appelées sur une instance d'une classe. Pour cela, vous pouvez utiliser instance_methods, qui retourne des résultats sensiblement différents pour Object et Class.

19voto

Simone Carletti Points 77653

En Ruby, tout est une Object y compris les classes et les modules. Object est le plus bas niveau de la classe (enfin, dans Ruby 1.9.2 il est également BasicObject , mais ceci est une autre histoire).

Consultez le résultat suivant.

> Object.ancestors
# => [Object, Kernel, BasicObject] 
> Class.ancestors
# => [Class, Module, Object, Kernel, BasicObject] 
> Module.ancestors
# => [Module, Object, Kernel, BasicObject] 
> String.ancestors
# => [String, Comparable, Object, Kernel, BasicObject]

Comme vous pouvez le voir, les deux Class et Module hérite Object.

Retour à les originaux de vos affirmations, vous devez comprendre la différence entre

  • is_a?
  • kind_of'
  • instance_of?

Ils ne sont pas interchangeables. is_a? et kind_of? retourne true si l'autre est de la même classe ou d'un ancêtre. À l'inverse, instance_of? retourne vrai que si l'autre est dans la même classe.

> Class.is_a? Object
# => true 
> Class.kind_of? Object
# => true 
> Class.instance_of? Object
# => false 

2voto

Augusto Points 14531

Ramesh, en ruby, tout est un objet et une classe ne fait pas exception.

essayez ceci en irb

 ruby-1.9.2-p136 :001 > o = Object.new
=> #<Object:0x000001020114b0> 
ruby-1.9.2-p136 :002 > o.is_a? Class
=> false 
ruby-1.9.2-p136 :003 > o.is_a? Object
=> true 
 

dans ce cas, j'ai créé une instance d'un objet et vérifié s'il s'agissait d'une classe (false) ou d'un objet (true).

Une classe en ruby est une sorte d'objet modèle utilisé pour créer des instances de cette classe. Désolé que ce ne soit pas super clair. Le concept clé est que ruby est un langage purement orienté objet, par opposition à Java.

2voto

Damien Pollet Points 3254

La classe/métaclasse hiérarchie est toujours un peu perplexe :) Juste pour comparaison, voici l'un dans Smalltalk; en Ruby, la configuration est basée sur les mêmes principes, sauf qu'il n'ont pas l' Behavior et ClassDescription des distinctions, et il existe des modules et eigenclasses à prendre en compte.

Une explication complète du modèle objet de Smalltalk est disponible dans Pharo, par Exemple, comme indiqué par cette question connexe.

1voto

Subtletree Points 504

Comme _why écrit dans cet article

les objets ne stockent pas les méthodes, seules les classes le peuvent.

Les deux premières sections ont quelques points positifs sur les classes et les objets

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