2014-12-25 12 views
5

Nie mam pojęcia o modelu obiektów Ruby. Po pierwsze, WSZYSTKO w Rubim jest instancją Class? Wszystkie one produkować prawdziwe:Dlaczego WSZYSTKO jest instancją klasy w Ruby?

p Object.instance_of?(Class) 
p Class.instance_of?(Class) 
p Module.instance_of?(Class) 
p BasicObject.instance_of?(Class) 
class Hello; end 
p Hello.instance_of?(Class) 

nie mogę całkiem się jak to jest możliwe, 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 w modelu obiektów Ruby wyraźnie określa tę hierarchię)? Co pozwala na pewien crazyness tak:

p BasicObject.is_a?(Object) #=> true 

gdzie BasicObject.class jest Class i Class.is_a?(Object).

Przy okazji, używając Ruby 2.0.

Odpowiedz

11

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.

2

Należy zauważyć, że:

p BasicObject.instance_of?(BasicObject) 

drukuje false.

To wyrażenie BasicObject nie jest instancją BasicObject, jest instancją coś innego, to znaczy, że jest Class obiekt, który reprezentuje obiekt, który posiada (na przykład) metod klasy, takie jak new.

Na przykład

p (BasicObject.new()).instance_of?(BasicObject) 

drukuje true i

p (BasicObject.new()).instance_of?(Class) 

drukuje false.

0

Wszystkie twoje przykłady były z definicji klas. Klasy są również obiektami. Ale czego nie robić spojrzenie na instancji klasy:

p Object.new.class 
p Hello.new.class 

Klasy określić formę obiektu i definicji, klasa to klasa. Ale kiedy tworzysz instancję klasy w obiekcie, obiekt jest nowym typem. Ale nadal można zobaczyć, że klasa obiektu jest sama klasa:

p Hello.new.class.class 
+0

Twoje ostatnie zdanie powinno chyba być „... że klasa obiektu class jest się' Class'”lub„... że klasa obiektu jest się do (n wystąpienie) "Klasa" " –

Powiązane problemy