2009-09-07 4 views
5

W języku Ruby (1.8.X)Dlaczego obiekt obejmuje zarówno jądro, jak i dziedziczy je w Ruby?

Dlaczego obiekt dziedziczy jądro i dołącza go? Czy nie wystarczyłoby tylko dziedziczenie?

 
irb(main):006:0> Object.ancestors 
=> [Object, Kernel] 
irb(main):005:0> Object.included_modules 
=> [Kernel] 
irb(main):011:0> Object.superclass 
=> nil 

Uwaga w Ruby 1.9 sytuacja jest podobna (ale nieco czystsze):

 
irb(main):001:0> Object.ancestors 
=> [Object, Kernel, BasicObject] 
irb(main):002:0> Object.included_modules 
=> [Kernel] 
irb(main):011:0> Object.superclass 
=> BasicObject 
irb(main):011:0> BasicObject.superclass 
=> nil 
irb(main):011:0> BasicObject.included_modules 
=> [] 

Odpowiedz

12

Object nie dziedziczą Kernel jest ostateczna nadklasą (w Ruby 1.8). Wynik metody #ancestors obejmuje moduły nadrzędne z klasy i. W szczególności, w kolejności są wyszukiwane dla konkretnego połączenia.

+2

nie należy mylić dolnej linii, przodków i nadklasy –

5

Po dołączeniu modułu do klasy staje się on częścią hierarchii dziedziczenia. Dlatego włączenie jądra Object.ancestors do jądra będzie zawierało (nie gra słów) Kernel. W wersjach ruby ​​< 1.9 Obiekt znajduje się na szczycie hierarchii, więc nie ma żadnej nadklasy

Powiązane problemy