2010-05-18 12 views
5

Czytałem Metaprograming Ruby, a model obiektu jest jak dylemat z kurczaka lub jajka.Co jest pierwsze w modelu obiektu Ruby?

W Rubim 1.8 klasa Object jest instancją klasy. Nadklasa modułu to Object i jest instancją klasy. Nadklasą klasy jest Moduł, a jest to instancja klasy (samoodnosząca się). Powiedz klasa SomeClass; koniec jest gdzieś zdefiniowany; SomeClass jest instancją klasy, jednak jej nadklasą jest Object. Dlaczego instancja klasy ma obiekt jako nadklasę zamiast zera?

Ponadto, jeśli Obiekt ma istnieć, to Klasa musi istnieć, ale wtedy Moduł musi istnieć, ale dla Modułu istnieje Obiekt musi istnieć. W jaki sposób tworzone są te klasy?

Odpowiedz

5

Powyżej znajduje się pełna Ruby Class Diagram (Ruby 1.8): http://banisterfiend.wordpress.com/2008/11/25/a-complete-ruby-class-diagram/

Aby pomóc zrozumieć dziwną pozornie niemożliwego samodzielne refleksyjny charakter diagramie klasy Warto wiedzieć, że wskaźniki klasy i klasy wskazówek Super można przypisać w dowolnym momencie w C API. Oznacza to, że można utworzyć obiekt (w C API) i po fakcie określić, co wskazują wskaźniki klasy i super klasy.

Ponadto, aby zrozumieć kolejność definicji, spojrzeć na Init_Object() w object.c (w Ruby 1.9)

rb_cBasicObject = boot_defclass("BasicObject", 0); 
rb_cObject = boot_defclass("Object", rb_cBasicObject); 
rb_cModule = boot_defclass("Module", rb_cObject); 
rb_cClass = boot_defclass("Class", rb_cModule); 

metaclass = rb_make_metaclass(rb_cBasicObject, rb_cClass); 
metaclass = rb_make_metaclass(rb_cObject, metaclass); 
metaclass = rb_make_metaclass(rb_cModule, metaclass); 
metaclass = rb_make_metaclass(rb_cClass, metaclass); 
boot_defmetametaclass(rb_cModule, metaclass); 
boot_defmetametaclass(rb_cObject, metaclass); 
boot_defmetametaclass(rb_cBasicObject, metaclass); 

Gdzie rb_cBasicObject jest BasicObject w Ruby, rb_cObject jest Object w Ruby, i tak dalej.

1

Najłatwiejszą rzeczą do rozważenia jest to, że wszystko w Ruby jest obiektem. Wszystko inne jest modyfikacją tej koncepcji. Klasa Klasa dodaje funkcjonalność podobną do klasy, modyfikując Obiekt. W rezultacie każdy obiekt jest klasą, itp.

Nadklasa obiektu jest zerowa. (Reference)

Nadklasą obiektu jest BasicObject (w 1.9), a superklasa BasicObject jest zerowa.

+0

Ok, więc obiekt jest najpierw tworzony (w 1.8), a następnie później zmodyfikowany tak, że Object # klasie jest klasa? – Timothy