Ruby Verrücktheit: Klasse vs Objekt?
Ich habe gerade angefangen zu spielen mit JRuby. Dies ist mein erstes ruby-post. Ich hatte eine harte Zeit zu verstehen, Klassen vs. Objekte in Ruby. Es bedeutet nicht, dass wie welche Klassen & Objekte, die in anderen objektorientierten Sprachen. ein Beispiel für
Class.is_a? Object
gibt wahr
und
Object.is_a? Object
zu.
so Klasse & Objekt sind beide Objekte
hier kommt ein weiteres
Class.is_a? Class
gibt wahr
und
Object.is_a? Class
zu.
warten, ich bin noch nicht fertig
Object.instance_of? Class
Class.instance_of? Class
Beide wahr sind
Object.instance_of? Object
Class.instance_of? Object
Beide sind falsch. richtig, nichts kann die Instanz des Objekts.
Und
Class.kind_of? Class
Object.kind_of? Class
beide wahr sind
Class.kind_of? Object
Object.kind_of? Object
beide wahr sind
Also beide sind genau die gleichen, warum dann nicht wir haben diese beiden.?
Nach etwas mehr Graben, schrieb ich diese einfache Methode, um die return-Methode, Liste unterstützt sowohl
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
Einzige Methode Differenz zwischen zeige_methoden(Objekt) und zeige_methoden(Klasse) ist
Nesting
wenn Verschachtelung bedeutet Vererbung, Objekt Ist ähnlich wie die geschlossene Klasse??
Kann jemand klären Sie mich, was ist das?
Update: Zu Edds Kommentar
Interessanterweise sehe ich viele Unterschiede in der Methode-Liste in
c=Class.new
print_methods(c)
&
o=Object.new
print_methods(o)
Jetzt verstehe ich die Instanz einer Klasse ist wirklich eine Instanz der Klasse (Und Klasse-Instanz-ist eigentlich ein Objekt) kein Objekt-Instanz. Und auch diese Instanz erlauben Sie mir, span weiteren Instanzen
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
Also Endlich, Objekt ist eine Instanz einer Klasse. Da
xx.is_a? Class
falsch ist, aber
xx.is_a? Object
gibt true zurück,
Bin ich rechts ??
- +1: für eine gute deduktiven Fähigkeiten
- Ich kann wärmstens empfehlen die Pickel-Behandlung zu diesem Thema: ruby-doc.org/docs/ProgrammingRuby/html/classes.html
- danke Kumpel.. werde schauen.. 🙂
- Es ist auch erwähnenswert, dass Ihr Graben so weit angeschaut hat Methoden der Klasse Object und die Klasse, die ähnlich sind, aber nicht auf die Instanz-Methoden. Eine Instanz der Klasse hat eine Reihe von Methoden, die eine Instanz des Objekts nicht haben. Wenn Sie über eine kurze Erklärung wäre es sehr interessant zu hören!
- ich habe meinen Beitrag aktualisiert, überprüfen Sie bitte aus..
- Um finde den Unterschied in den Methoden, die es einfacher zu verwenden, so etwas wie Klasse.Methoden - Objekt.Methoden .
- "So Endlich, Objekt ist eine Instanz einer Klasse." - Ja.
Object
in ruby ist Analog zujava.lang.Object.class
in Java.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grundsätzlich die wichtige Sache zu verstehen ist, dass jede Klasse eine Instanz der
Class
Klasse und jede Klasse ist eine Unterklasse vonObject
(in 1.8 in 1.9 jede Klasse ist eine Unterklasse vonBasicObject
). So ist jede Klasse ist ein Objekt in dem Sinne, dass es eine Instanz einer Unterklasse vonObject
, d.h.Class
.Natürlich bedeutet dies, dass
Class
ist eine Instanz von sich selbst. Wenn das macht Ihr Gehirn verletzt, nur denken Sie nicht zu tief.Object
undClass
sindis_a? Object
x.is_a? y
zurücktrue
wennx.class == y or x.class < y
ist, D. H. wennx
's Klassey
oderx
's Klasse erbt vony
. Da jede Klasse erbt von objectx.is_a? Object
gibt true zurück, egal wasx
ist. (Bei 1,8 sowieso, in 1.9 gibt es auchBasicObject
was ist jetzt die basic-Klasse in der Vererbungshierarchie).Sie sind auch
is_a? Class
Beide
Object
undClass
sind in der Tat Klassen, so dass sollte nicht überraschend sein.Sie sind auch
instance_of? Class
, aber nichtinstance_of? Object
.Im Gegensatz zu
is_a?
,x.instance_of? y
nur gibt true zurück, wennx.class == y
nicht, wennx.class
ist eine Unterklasse vony
. Also da beidex
undy
sindinstance_of? Class
sind Sie nichtinstance_of? Object
.Dass das nicht stimmt.
Object.new.instance_of? Object
wahr ist.kind_of?
kind_of?
ist ein alias füris_a?
, also siehe oben.Es sollte darauf hingewiesen werden, dass alles bis jetzt gilt für alle Klassen. E. g.
String.is_a? Object
,String.is_a? Class
undString.instance_of? Class
wahr undString.instance_of? Object
ist falsch, aus den gleichen Gründen wie oben. (AuchString.is_a? String
undString.instance_of? String
beide falsch, aus den gleichen Gründen - String ist eine Klasse, kein string).Können Sie nicht daraus schließen, dass alle Klassen gleich sind. Sie sind einfach alle Instanzen der gleichen Klasse.
Vergleich von Methoden
Da beide
Object
undClass
sind Klassen, beide haben die Instanz-Methoden definiertClass
.Class
hat zusätzlich die singleton-Methodenesting
.nesting
sagt Ihnen, welches Modul Sie gerade verschachtelt, es hat nichts zu tun mit der Vererbung.Für eine bestimmte Klasse
TheClass.methods
zurückkehren wird, die Instanz-Methoden definiertClass
(z.B.superclass
gibt die Klasse, dieTheClass
erbt, undnew
legt eine neue Instanz vonTheClass
) plus die singleton-Methoden von dieser Klasse definierten.Sowieso
methods
nur sagt Ihnen, welche Methoden aufgerufen werden können, direkt auf ein bestimmtes Objekt. Es sagt Ihnen nicht, welche Methoden aufgerufen werden können, die auf eine Instanz einer Klasse. Für die, die Sie verwenden könneninstance_methods
gibt deutlich unterschiedliche Ergebnisse fürObject
undClass
.In Ruby ist alles ein
Object
einschließlich Klassen und Module.Object
ist die low-level-Klasse (gut, in Ruby 1.9.2 es ist auchBasicObject
aber das ist eine andere Geschichte).Finden Sie in der folgenden Ausgabe.
Wie Sie sehen können, beide
Class
undModule
erbt vonObject
.Zurück zu Ihrem ursprünglichen Behauptungen, die Sie haben, um den Unterschied zu verstehen zwischen
is_a?
kind_of'
instance_of?
Sind Sie nicht austauschbar.
is_a?
undkind_of?
gibt true zurück, wenn der andere derselben Klasse oder in einem Vorfahren. Umgekehrtinstance_of?
gibt true zurück, nur, wenn der andere die gleiche Klasse.Object.instance_of? Class
wahr ist. Ich denke, es ist weilObject
ist die ständige Klassendefinition des Objekts, undClass
ist die ständige Klassendefinition der Klasse, so sind beide Instanzen vonClass
. Es ist noch nicht ganz klar für mich.Ramesh, in ruby alles ist ein Objekt, und eine Klasse ist keine Ausnahme.
versuchen Sie es in irb -
in diesem Fall habe ich erstellt eine Instanz eines Objekts, und überprüft, ob es einer Klasse (false) oder ein Objekt (true).
Einer Klasse in ruby, ist eine Art template-Objekt verwendet, zum erstellen von Instanzen der Klasse. Sorry, dass dies nicht super klar. Der Schlüssel Konzept ist, dass ruby ist eine Reine objektorientierte Sprache, im Gegensatz zu Java.
Klassen-Metaklasse Hierarchie ist immer ein wenig rätselhaft 🙂 Nur mal so zum Vergleich, hier ist der in Smalltalk; in Ruby, das setup basiert auf den gleichen Prinzipien, außer das es nicht die
Behavior
undClassDescription
Unterscheidungen, und es gibt Module und eigenclasses zu berücksichtigen.Einer vollständigen Erläuterung der Smalltalk Objekt-Modell ist erhältlich in Pharo by Example, wie bereits durch das stellt sich die Frage,.
Als _warum schreibt in dieser Artikel
Den ersten paar Abschnitte haben einige gute Punkte über die Klassen vs. Objekte
Einer der Antworten erwähnt:
Ich möchte nur word es anders für diejenigen, die ein wenig Hirn verdrehen. Zuerst Fragen Sie sich: Was ist eine Instanz in der Programmierung? Und was ist eine Unterklasse in der Programmierung? Eine Instanz ist nur eine realisierte Variante eines bauplan (der Klasse). Eine Unterklasse ist einfach eine Klasse (bauplan), die von einer anderen Klasse erbt (blueprint). Also, wenn Sie eine neue Klasse erstellen:
Apple ist eine Instanz der Klasse, d.h., es ist eine realisierte Variante des Entwurfs. Es nimmt den Entwurf und füllt die details (Methoden und Variablen), die mit Ihrer eigenen variation. Gut, die Blaupause erbt von einer anderen Blaupause, das ist-Objekt. Also jede Klasse ist eine Instanz der Klasse, die eine Unterklasse von Object.
Hinweis Klasse hat das Modul in seiner Vererbungskette (Modul der Klasse als mixin vielleicht da Class parent-Objekt?).
Instanzen (A. new) der Klasse A haben Ihre eigenen erkannte, Variationen von A. Aber Sie sind Objekt-Instanzen. So müssen wir unterscheiden Klassen-Instanzen (z.B. Klasse-A-end) und Objekt-Instanzen ( a = A. neuer). Objekt-Instanzen haben einer anderen Vererbungskette. Sie sind eine realisierte Variante einer Instanz der Klasse Blaupause, nicht eine Variante der class-Klasse.
Diese Mittel in Ihrer Vererbung Kette ist nicht Klasse oder ein Modul. Sondern auch andere Objekt-Instanzen, so dass, wenn Ein ist-Objekt-Instanzen und B auf Objekt-Instanzen und A erbt von B, wenn wir instanziieren ein neues Objekt-Instanz Ein, wird diese Instanz haben die B-Instanzen in seiner Vererbungskette.
Werden Sie auch Erben von Object, da alles in Ruby erbt von Object.
- Und dies ist der beste Weg, um an alles denken. Gehen Sie nicht zu tief mit Ihr denken. Akzeptieren Sie diese, wie ich geschrieben haben.
Denken Sie an Klassen als Globale Objekte.