Но вы можете перезаписать константы в Ruby (независимо от того, является ли это модулем, классом или простым другим объектом):
MyConst = 1
# do stuff...
old_my_const = MyConst
MyConst = 5
puts "MyConst is temporarily #{MyConst}"
MyConst = old_my_const
puts "MyConst is back to #{MyConst}"
Выход:
a.rb:6: warning: already initialized constant MyConst
MyConst is temporarily 5
a.rb:8: warning: already initialized constant MyConst
MyConst is back to 1
Предупреждения просто: предупреждения. Ваш код будет продолжать работать так же.
Хорошо, может быть, предупреждения по какой-то причине недопустимы в вашей ситуации. Используйте этот suppress_all_warnings
метод, который я написал . Пример включает переназначение модуля.
def suppress_all_warnings
old_verbose = $VERBOSE
begin
$VERBOSE = nil
yield if block_given?
ensure
# always re-set to old value, even if block raises an exception
$VERBOSE = old_verbose
end
end
module OriginalModule
MyConst = 1
end
module OtherModule
MyConst = 5
end
def print_const
puts OriginalModule::MyConst
end
print_const
suppress_all_warnings do
old_module = OriginalModule
OriginalModule = OtherModule
print_const
OriginalModule = old_module
end
print_const
Теперь вы получите правильный вывод, но без предупреждений:
1
5
1