Поведение, которое вы наблюдаете, нормальное.Когда вы выполняете C = 1
в области вызова NameSpaces.namespace
, постоянная "C" определяется для NameSpaces
.(Вы можете подтвердить это, попробовав NameSpaces::C
.)
Чтобы получить желаемый эффект, вам необходимо использовать привязку анонимного модуля .Попробуйте это:
namespace1 = Module.new.class_eval("binding")
namespace2 = Module.new.class_eval("binding")
namespace1.eval("C = 1")
namespace1.eval("C")
=> 1
namespace2.eval("C")
NameError: uninitialized constant #<Module:0xf09180>::C
Обратите внимание, что любые константы, определенные в Object (т. Е. Глобальная область), будут доступны в коде, переданном в eval
, и если значения таких констант будут изменены воцененный код, изменение будет видно глобально!
(Даже если вы оцениваете код в контексте BasicObject, который не наследуется от Object, оцененный код может по-прежнему констант доступаопределено для объекта путем добавления префикса имени к «::»)