Reputation: 1278
I am confused. When I define a method in Object I can call it in Objects superclass BasicObject!
Like so:
class Object
def object_method
"object_method called"
end
end
Object.superclass.respond_to? :object_method
# => true
Object.superclass.object_method
# => "object_method called"
I have expected that only derived classes inherit the new method!
P.S.: I come to this question from an exercise on rubymonk
.. implement a method superclasses inside Object ..
where the recursion stop criterion is "affected".
Upvotes: 2
Views: 319
Reputation: 806
When you call Object.superclass
, you get an object that describes BasicObject
class.
This object is an instance of Class
class that inherits from Object
. Therefore, it has all the methods that Object
has, including the one you added.
However, instances of the BasicObject
class do not have this method:
irb(main):122:0> Object.object_method
=> "object_method called"
irb(main):123:0> Object.new.object_method
=> "object_method called"
irb(main):124:0> Object.superclass.object_method # Same as BasicObject.object_method
=> "object_method called"
irb(main):125:0> Object.superclass.new.object_method # Same as BasicObject.new.object_method
NoMethodError: undefined method `object_method' for #<BasicObject:0x441743be>
from (irb):125:in `evaluate'
from org/jruby/RubyKernel.java:1065:in `eval'
from org/jruby/RubyKernel.java:1390:in `loop'
from org/jruby/RubyKernel.java:1173:in `catch'
from org/jruby/RubyKernel.java:1173:in `catch'
from ~/.rvm/rubies/jruby-1.7.0/bin/irb:13:in `(root)'
Here is more stuff to meditate on:
irb(main):129:0> Object
=> Object
irb(main):130:0> Object.class
=> Class
irb(main):131:0> Object.new.class
=> Object
irb(main):132:0> Object.superclass
=> BasicObject
irb(main):133:0> Object.superclass.class
=> Class
irb(main):134:0> Object.superclass.new.class
NoMethodError: undefined method `class' for #<BasicObject:0x1c944d4a>
from (irb):134:in `evaluate'
from org/jruby/RubyKernel.java:1065:in `eval'
from org/jruby/RubyKernel.java:1390:in `loop'
from org/jruby/RubyKernel.java:1173:in `catch'
from org/jruby/RubyKernel.java:1173:in `catch'
from ~/.rvm/rubies/jruby-1.7.0/bin/irb:13:in `(root)'
Have fun!
Upvotes: 3
Reputation: 15010
As you can see, it is a derived class.
#ruby 1.8.7
Object.superclass
# => nil
nil.kind_of? Object
# => true
#ruby 2.0.0
Object.superclass
# => BasicObject
BasicObject.kind_of? Object
# => true
Upvotes: 3