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 code snippet that I dreamed up:
p Module.constants.length # => 88 $snapshot1 = Module.constants class A NAME=:abc $snapshot2 = Module.constants p $snapshot2.length # => 90 p $snapshot2 - $snapshot1 # => ["A", "NAME"] end p Module.constants.length # => 89 p Module.constants - $snapshot1 # => ["A"] p A.constants # => ["NAME"] The book states that the class method constants returns the list of constants for the class (as you can see in the output for A.constants). I was trying to get the list of constants defined for the Module class when I came across the above strange behavior.
A's constants show up in Module.constants. How do I get the list of constants defined by the Module class?
The docs state
Module.constantsreturns all constants defined in the system. including names of all classes and methods
Since A inherits its implementation from Module.constants, how does it behave differently in the base and derived types?
p A.class # => Class p A.class.ancestors # => [Class, Module, Object, Kernel] Note: If you're using Ruby 1.9, constants would return an array of symbols instead of strings.