Question
How do I get constants defined by Ruby's Module class via reflection?
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.constants
returns 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.