Хороший вопрос!
Ваша путаница связана с тем, что метод класса Module.constants
скрывает метод экземпляра Module#constants
для Module
.
В Ruby 1.9 это было решено добавлением необязательного параметра:
# 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).
В приведенном выше примере A.constants
вызывает Module#constants
(метод экземпляра), а Module.constants
вызывает, Module.constants
.
В Ruby 1.9 вы хотите вызвать Module.constants(true)
.
В Ruby 1.8 можно вызывать метод экземпляра #constants
для Module
. Вам нужно получить метод экземпляра и связать его как метод класса (используя другое имя):
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
Хотелось бы полностью перенести функциональность 1.9 на 1.8 для моего backports
гема, но я не могу придумать, как получить в Ruby 1.8 только константы модуля, исключая унаследованные.
Редактировать : Просто изменили официальную документацию, чтобы правильно отразить это ...