2012-02-10 4 views
24

Есть ли способ отключить warning: already initialized constant при загрузке определенных файлов?Как отключить предупреждение о переопределении константы при загрузке файла

+3

Зафиксирован код действительно не может быть и речи? – sarnold

+1

Предупреждения часто указывают на нефатальные ** ошибки ** и должны быть исправлены. В этом случае у вас действительно есть настоящая проблема, которая должна быть исправлена. –

+1

вы инициализировали свою переменную более одного раза. –

ответ

5

Для подавления предупреждений, используйте следующий код в верхней части скрипта:

$VERBOSE = nil 
12

Принятый ответ this question был полезен. Я посмотрел на источник Rails, чтобы получить следующее. До и после загрузки файла я могу вставить следующие строки:

# Supress warning messages. 
original_verbose, $VERBOSE = $VERBOSE, nil 
    load(file_in_question) 
# Activate warning messages again. 
$VERBOSE = original_verbose 
+0

это сработало. Вероятно, я должен написать для него обертку. – Dorian

39

Решение проблемы зависит от того, что ее вызывает.

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' 
15

Попробуйте следующее:

Kernel::silence_warnings { MY_CONSTANT = 'my value '} 
+3

Этот метод не существует с Ruby 2.0.0. – bfontaine

+5

Это часть рельсов: http://api.rubyonrails.org/classes/Kernel.html#method-i-silence_warnings – stackdump

+2

Отличное решение, это часть рельсов, но вы можете просто импортировать 2 метода 'silence_warnings' и' with_warnings' в файле по вашему выбору и патч 'Kernel' с ним. – Benj

 Смежные вопросы

  • Нет связанных вопросов^_^