Решение вашей проблемы зависит от того, что ее вызывает.
1 - Вы меняете значение константы, которое было задано ранее где-то в вашем коде, или пытаетесь определить константу с тем же именем, что и у существующего класса или модуля. Решение: не используйте константы, если вы заранее знаете, что значение константы изменится; не определяйте константы с тем же именем, что и класс / модули.
2 - Вы находитесь в ситуации, когда вы хотите переопределить константу по уважительным причинам, не получая предупреждений. Есть два варианта.
Во-первых, вы можете отменить определение константы, прежде чем переопределять ее (для этого требуется вспомогательный метод, поскольку remove_const
является закрытой функцией):
Object.module_eval do
# Unset a constant without private access.
def self.const_unset(const)
self.instance_eval { remove_const(const) }
end
end
Или вы можете просто сказать интерпретатору Ruby замолчать (это подавляет все предупреждения):
# Runs a block of code without warnings.
def silence_warnings(&block)
warn_level = $VERBOSE
$VERBOSE = nil
result = block.call
$VERBOSE = warn_level
result
end
3 - Вам требуется внешняя библиотека, которая определяет класс / модуль, имя которого конфликтует с новой константой или классом / модулем, который вы создаете. Решение: оберните ваш код в пространство имен модулей верхнего уровня, чтобы предотвратить конфликт имен.
class SomeClass; end
module SomeModule
SomeClass = '...'
end
4 - То же, что и выше, но вам абсолютно необходимо определить класс с тем же именем, что и у класса gem / library. Решение: вы можете присвоить имя класса библиотеки переменной, а затем очистить его для дальнейшего использования:
require 'clashing_library'
some_class_alias = SomeClass
SomeClass = nil
# You can now define your own class:
class SomeClass; end
# Or your own constant:
SomeClass = 'foo'