Ваш module_eval на самом деле не помещает константу в модуль.Затем вы просто получаете к нему доступ из основного:
module B;end
B.module_eval { FOO = 'asdf' }
>> FOO
=> "asdf"
Вы можете исправить это с помощью self::FOO = 'asdf'
, тогда это то же самое, что и B.const_set(:FOO,'asdf')
.Вы также можете сделать это более прямо так:
B::FOO = 'asdf'
Основная проблема с вашим кодом состоит в том, что вы не можете получить доступ к константам из других модулей, подобных этому.Если они находятся во внешнем модуле, вам нужно указать область действия константы с префиксом ::
:
def foo
B::FOO
end