Подтвердить что ты не робот

Решения для раздражающего сообщения "предупреждение: уже инициализированное постоянное"

Сегодня я наткнулся на сложную проблему с константами Ruby. В нашей команде кто-то создал модуль, который включен в несколько моделей. На нашем тестовом выходе (spec) это приводит к предупреждающим сообщениям, таким как:

/home/ayrton/project/lib/life_cycle.rb:5: предупреждение: уже инициализировано константа RESET

Один из способов решить это - объявить ваши константы следующим образом:

module LifeCycle

  unless (const_defined?(:RESET))
    RESET = 'reset'
  end

  #...
end

Я также прочитал сообщение в блоге, написанное Авди Гриммом, которое предоставляет альтернативное решение , мне было интересно, каковы ваши мнения, по этому вопросу.

4b9b3361

Ответ 1

Сегодня я столкнулся с этой же проблемой и нашел простое решение.

Поскольку предупреждение состоит в попытке переназначить константу с тем же значением, я просто изменил

module LifeCycle
  RESET = 'reset'
end

to

module LifeCycle
  RESET ||= 'reset'
end

Это позаботилось о предупреждении и намного проще, чем проверять, определена ли каждая константа. Дайте мне знать, если вы найдете лучшее решение.

Ответ 2

Это только проблема в приложениях, которые явно перезагружаются, например, приложения Rails.

Если многословие оскорбляет вас, вы можете использовать unless в качестве модификатора оператора:

module LifeCycle
  RESET = 'reset' unless const_defined?(:RESET)
end

Это оставляет несколько слабых аргументов против предложения Авди только для использования методов:

  • постоянный поиск быстрее, чем поиск методов,
  • константные значения определяются при загрузке, а не в (первом) запросе,
  • константы визуально предполагают, что они не требуют никакой работы для вывода, и

Если вам нравится предложение Авди, чтобы игнорировать их, пойдите с ним.

Ответ 3

RESET не является константой, если он продолжает меняться в вашем коде. Если вы переименуете его в нижний регистр "reset", проблема исчезнет. Ruby считает, что переменные верхнего регистра являются константами и, таким образом, отображают ошибку, предупреждающую вас о том, что константа изменилась.

Ответ 4

Я получил эту ошибку в Ruby, когда Intellij IDE.. Это было связано с объявлением переменной, начинающейся с верхнего регистра.. сделать это в нижнем регистре, разрешит эту проблему.