Я долго знал, что "константы" в Ruby (т.е. имена переменной, которые использованы для своей выгоды) не являются действительно постоянными. Как другие языки программирования, ссылка на объект является единственной вещью, сохраненной в переменном/постоянном. (Боковая панель: Ruby действительно имеет средство, чтобы "заморозить" ссылочные объекты от того, чтобы быть измененным, которое насколько я знаю, не является способностью, предлагаемой на многих других языках.)
Таким образом, вот мой вопрос: когда Вы повторно присваиваете значение в константу, Вы получаете предупреждение как так:
>> FOO = 'bar'
=> "bar"
>> FOO = 'baz'
(irb):2: warning: already initialized constant FOO
=> "baz"
Существует ли способ вынудить Ruby выдать исключение вместо того, чтобы печатать предупреждение? Трудно выяснить, почему переназначения иногда происходят.
Посмотрите на Можете ли вы попросить Ruby обрабатывать предупреждения как ошибки? , чтобы увидеть, как в некоторых случаях можно рассматривать предупреждения как ошибки.
В противном случае, я полагаю, вам придется написать собственный метод для назначения констант и вызова исключения, если оно уже назначено.
Если вы знаете, что переназначение происходит с определенной константой, вы также можете добавить проверку работоспособности непосредственно перед назначением.
Вы не можете перехватить его напрямую, нет.
Если вам действительно это нужно, я могу подумать об очень грязном взломе. Вы можете перенаправить стандартную ошибку ввода-вывода на пользовательский объект ввода-вывода. Затем метод write
может проверить, что пишется; если он содержит «предупреждение: уже инициализированная константа»
, тогда вы вызываете, в противном случае вы перенаправляете вызов стандартной ошибке write
.