2009-08-02 5 views

Antwort

10

Klasse gibt die Klasse (#Typ) nicht der Vorgänger. Die Klasse von Objekten ist Klasse. Klasse ist Klasse. Klasse ist ein Objekt. Wahrheit in der Werbung: Ich habe Ruby nie gelernt, aber die Object-Class-Relation hat, um der eine Smalltalk vor 30 Jahren zu sein.

+4

Metaklassen funktionieren anders in Ruby: Sie bekommen in die Methode Lookup-Kette injiziert, so hat Rubin nicht über die zwei parallele Hierarchien von Klassen und Metaklassen, aber, wie Sie sagen, die Grundlagen sind identisch. –

+0

@Jorg: Danke. Sobald ich mein aktuelles Projekt beendet habe, werde ich auf Rails und Ruby aufheben, ich habe so viel Lob gehört, dass ich fasziniert bin :) –

+0

Danke. Ich denke, ich bin mir jetzt über die Beziehungen klar. @ Jörg_W_Mittags Informationen helfen auch. Das heißt, Klassen und Metaklassen sind zwei verschiedene, aber verwandte Konzepte. – fwoncn

5

Dies ist so, wie es in Ruby 1.9 funktioniert:

Class.class = Class 

Class.superclass = Module 
Module.class = class 
Module.superclass = Object 
Object.class = Class 
Object.superclass = BasicObject 
BasicObject.class = Class 
BasicObject.superclass = nil 
6

Object ‚s-Klasse ist Class (seit Object selbst eine Klasse) und Object ist ein Vorfahre von Class.

Es gibt eine zirkuläre Referenz, es ist ziemlich komplex. Meine persönliche Empfehlung, wenn Sie nicht wirklich damit spielen müssen, gehen Sie nicht dorthin.

9

Klasse, Objekt, Modul und alle anderen Klassen sind Instanzen einer Klasse Klasse :)

Class.class == == Module.class Object.class == == Hash.class Klasse

Klasse ist auch ein Gegenstand (wie jedes andere Objekt in dem System), aber es ist nicht direkte Instanz-Objekt, ist es eine Instanz einer Klasse abgeleitet (Klasse in diesem Fall)

Class.superclass.superclass == Objekt (mit Modul in der Mitte)

Objekt selbst ist auch eine Klasse. also Object.class == Klasse

Klasse, Modul und Objekt haben eine kreisförmige Abhängigkeit, da sie im Kern des OO-Modells sind.

Object.class.superclass.superclass == Objekt

=> parent (.superclass) 
-> instance-of (.class) 

alt text http://www.grabup.com/uploads/b10b2ffa9976953e3d6f88e6fcbf6f28.png?direct

+0

Die zirkuläre Abhängigkeit funktioniert, weil alle eingebauten Klassen sind. Sie sind Teil der Kern-Laufzeit von Ruby und sind beim Start so eingerichtet und werden nicht so hinzugefügt, wie Sie normalerweise eine Klasse hinzufügen würden. Die Laufzeit hat die Macht, die Zeiger so einzurichten, wie sie wollen, und der Designer hat es so gewählt. –