Nano Hash - криптовалюты, майнинг, программирование

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

Есть ли способ отключить 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

Ответы:


1

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

$VERBOSE = nil
24.09.2013
  • Это наиболее полезно для других людей в более широком контексте, потому что постоянное переопределение — это только одна вещь, которая может вызвать нефатальные предупреждения компиляции. Это все очень хорошо, если вы предлагаете исправить свой код, но это предполагает, что вещь, вызывающая это, находится в вашем коде, а не в какой-то другой библиотеке. 31.07.2019

  • 2

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

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


    4

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

    # Supress warning messages.
    original_verbose, $VERBOSE = $VERBOSE, nil
        load(file_in_question)
    # Activate warning messages again.
    $VERBOSE = original_verbose
    
    10.02.2012
  • это сработало. Я, вероятно, должен написать обертку для него. 14.10.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..