Good question!
Your confusion is due to the fact that the class method Module.constants hides the instance method Module#constants for Module.
In Ruby 1.9, this has been addressed by adding an optional parameter:
# No argument: same class method as in 1.8:
Module.constants # ==> All constants
# One argument: uses the instance method:
Module.constants(true) # ==> Constants of Module (and included modules)
Module.constants(false) # ==> Constants of Module (only).
In your example above, A.constants calls Module#constants (the instance method), while Module.constants calls, well, Module.constants.
In Ruby 1.9, you thus want to call Module.constants(true).
In Ruby 1.8, it is possible to call the instance method #constants on Module. You need to get the instance method and bind it as a class method (using a different name):
class << Module
define_method :constants_of_module, Module.instance_method(:constants)
end
# Now use this new class method:
class Module
COOL = 42
end
Module.constants.include?("COOL") # ==> false, as you mention
Module.constants_of_module # ==> ["COOL"], the result you want
I wish I was able to backport the 1.9 functionality completely to 1.8 for my backports gem, but I can’t think of a way to get only the constants of a Module, excluding the inherited ones, in Ruby 1.8.
Edit: Just changed the official documentation to correctly reflect this…