Po pierwsze, WSZYSTKO w Rubim jest instancją Class
?
Nie, nie wszystko jest instancją Class
. Tylko klasy są instancjami Class
.
Istnieje wiele rzeczy, które nie są instancjami Class
: łańcuchy, na przykład, są instancjami String
, a nie Class
. Tablice są przypadki Array
, całkowitymi są przypadki Integer
, pływaki są przypadki Float
, true
jest instancją TrueClass
, false
jest instancją FalseClass
, nil
jest instancją NilClass
, i tak dalej.
Każda klasa jest instancją o numerze Class
, tak jak każdy ciąg jest instancją String
.
jeśli Object
jest nadklasą Class
, jak to może być zarówno nadklasą Class
i wystąpienie z niej w tym samym czasie (większość diagramów na Ruby Object model wyraźnie wskazuje na ten hierarchii)?
Magia.
Podobnie jak w większości innych języków, istnieją pewne podstawowe jednostki, które po prostu uważa się za istniejące. Upadają z nieba, materializują się z powietrza, pojawiają się magicznie.
W Ruby, niektóre z tych magicznych rzeczy są:
Object
nie posiada superklasę, ale nie można zdefiniować klasę bez nadrzędnej, niejawny bezpośredniej nadklasy jest zawsze Object
. [Uwaga: mogą istnieć klasy kontrolne zdefiniowane przez implementację: Object
, ale ostatecznie będzie taka, która nie ma nadklasy.]
Object
jest wystąpienie Class
, które jest podklasy Object
(co oznacza, że pośrednio Object
jest wystąpienie Object
siebie)
Class
są podklasą Module
, która jest przykładem Class
Class
jest instancją Class
Żadnej z tych rzeczy nie można wyjaśnić w Rubiu.
BasicObject
, Object
, Module
i Class
wszystko trzeba skoczyć do istnienia w tym samym czasie, ponieważ mają one wzajemnie od siebie zależnych.
To, że ta relacja nie może być wyrażona w kodzie Ruby, nie oznacza, że specyfikacja języka Ruby nie może powiedzieć, że tak musi być. To wykonawca musi znaleźć sposób, aby to zrobić. W końcu implementacja Ruby ma poziom dostępu do obiektów, których ty jako programista nie masz.
Przykładowo, realizacja Ruby mógłby najpierw utworzyć BasicObject
ustawienie zarówno jego superclass
wskaźnika i jego class
wskaźnik do null
.
Następnie tworzy Object
, ustawiając jego superclass
wskaźnik BasicObject
i jego class
wskaźnik do null
.
Następnie tworzy Module
, ustawiając jego superclass
wskaźnik Object
i jego class
wskaźnik do null
.
Wreszcie tworzy Class
, ustawiając jego superclass
wskaźnik Module
i jego class
wskaźnik do null
.
Teraz możemy nadpisać BasicObject
's, Object
' s, Module
'S i Class
' s class
wskaźnik wskazywał Class
i skończymy.
Jest to łatwe do zrobienia z zewnątrz systemu, po prostu wygląda dziwnie od środka.
Twoje ostatnie zdanie powinno chyba być „... że klasa obiektu class jest się' Class'”lub„... że klasa obiektu jest się do (n wystąpienie) "Klasa" " –