Есть ли способ отключить warning: already initialized constant
при загрузке определенных файлов?
Как отключить предупреждение о переопределении константы при загрузке файла
- Действительно ли исправление кода невозможно? 11.02.2012
- Предупреждения часто указывают на нефатальные ошибки и должны быть исправлены. В этом случае у вас, скорее всего, есть реальная проблема, которую следует исправить. 11.02.2012
- вы инициализировали свою переменную более одного раза. 11.02.2012
- @DmitrySavy Да. Верно. Но это не ответ на мой вопрос. 11.02.2012
- возможный дубликат Как переопределить константу Ruby без предупреждения? 11.02.2012
- @theTinMan Спасибо. Я думаю, что ваша ссылка говорит мне, что мне нужно сделать. Но все же хотелось бы сделать это без использования специальных методов, упомянутых там. 11.02.2012
Ответы:
Чтобы отключить предупреждения, используйте следующий код в верхней части скрипта:
$VERBOSE = nil
Решение вашей проблемы зависит от того, что ее вызвало.
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 - То же, что и выше, но вам абсолютно необходимо определить класс с тем же именем, что и класс драгоценного камня/библиотеки. Решение: вы можете присвоить имя класса библиотеки переменной, а затем очистить ее для дальнейшего использования:
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'
Попробуй это :
Kernel::silence_warnings { MY_CONSTANT = 'my value '}
silence_warnings
и with_warnings
в файл по вашему выбору и исправить Kernel
с его помощью. 08.02.2015 Kernel::
, тогда он будет еще короче! 13.07.2018 Принятый ответ на этот вопрос был полезен. Я посмотрел на источник Rails, чтобы получить следующее. До и после загрузки файла я могу вставить эти строки:
# Supress warning messages.
original_verbose, $VERBOSE = $VERBOSE, nil
load(file_in_question)
# Activate warning messages again.
$VERBOSE = original_verbose