Решения для раздражающего сообщения "предупреждение: уже инициализированное постоянное"
Сегодня я наткнулся на сложную проблему с константами Ruby. В нашей команде кто-то создал модуль, который включен в несколько моделей. На нашем тестовом выходе (spec) это приводит к предупреждающим сообщениям, таким как:
/home/ayrton/project/lib/life_cycle.rb:5: предупреждение: уже инициализировано константа RESET
Один из способов решить это - объявить ваши константы следующим образом:
module LifeCycle
unless (const_defined?(:RESET))
RESET = 'reset'
end
#...
end
Я также прочитал сообщение в блоге, написанное Авди Гриммом, которое предоставляет альтернативное решение , мне было интересно, каковы ваши мнения, по этому вопросу.
Ответы
Ответ 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..
Это было связано с объявлением переменной, начинающейся с верхнего регистра.. сделать это в нижнем регистре, разрешит эту проблему.