I was trying to get Matz-n-Flanagan's RPL book's 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 that 'Module.constants returns all constants defined in the system. incl. 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.