I was trying to get Matz and Flanagan\'s \"Ruby Programming Language\" metaprogramming chapter into my head, However I couldn\'t understand the output from the following cod
I had to go back into my thinking cave for a while after Marc's response. Tinkered with more code snippets and then some more. Finally when Ruby's method resolution seemed to make sense wrote it down as a blog post so that I don't forget.
Notation: If A" is the eigenclass of A
When A.constants is called, method resolution (refer to the image in my blog post to have a visual aid) looks up the following locations in order
MyClass", Object", BasicObject" (singleton methods)Class (instance methods)Module (instance methods)Object (instance methods) and KernelBasicObject (instance methods)Ruby finds the instance method Module#constants
When Module.constants is called, Ruby looks at
Module", Object", BasicObject" (singleton methods)Class (instance methods)Module (instance methods)Object (instance methods) and KernelBasicObject (instance methods)this time, Ruby finds the singleton/class method at Module".constants as Marc said.
Module defines a singleton method which shadows the instance method. The singleton method returns all known constants whereas the instance method returns the constants defined in current class and its ancestors.