Как отключить предупреждение о переопределении константы при загрузке файла

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

30
задан sawa 16 October 2013 в 18:42
поделиться

3 ответа

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

$VERBOSE = nil
12
ответ дан 27 November 2019 в 23:08
поделиться

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

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'
44
ответ дан 27 November 2019 в 23:08
поделиться

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

# Supress warning messages.
original_verbose, $VERBOSE = $VERBOSE, nil
    load(file_in_question)
# Activate warning messages again.
$VERBOSE = original_verbose
13
ответ дан 27 November 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: