2009-09-07 8 views
5

En Ruby (1.8.X)¿Por qué Object incluye Kernel y lo hereda en Ruby?

¿Por qué Object hereda de Kernel e incluye? ¿No bastaría simplemente con heredar?

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

Nota en Ruby 1.9, la situación es similar (pero un poco más limpio):

 
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 
=> [] 

Respuesta

12

Object no hereda de Kernel, es la superclase final (en Ruby 1.8). El resultado del método #ancestors se compone de las superclases y módulos incluidos. Específicamente, en el orden en que se buscan para cualquier llamada en particular.

+2

línea inferior, los antepasados ​​y la superclase no se deben confundir –

5

Cuando incluye un módulo en una clase, se convierte en parte de su jerarquía de herencia. Por lo tanto, al incluir Kernel Object.ancestors se incluirá Kernel (sin ningún tipo de significado). En las versiones ruby ​​< 1.9 El objeto está en la parte superior de la jerarquía por lo que no tiene una superclase

Cuestiones relacionadas