Ruby - запретить переопределение констант - PullRequest
2 голосов
/ 05 ноября 2011

переопределение некоторой константы в Ruby (например, FOO = 'bar') генерирует предупреждение already initialized constant.

Я пытаюсь написать что-то вроде ReallyConstants модуля, где этот код должен иметь такое поведение:

ReallyConstants.define_constant(:FOO, 'bar') #=> sets the constant ReallyConstants::FOO to 'bar'
ReallyConstants::FOO #=> 'bar'
ReallyConstants::FOO = 'foobar' #=> this should raise an Exception

то есть постоянное переопределение должно генерировать исключение.

Это возможно?

1 Ответ

4 голосов
/ 05 ноября 2011

Просто поместите вашу константу в модуль, а затем используйте Module#freeze, чтобы запретить дальнейшую модификацию модуля.

Например,

module Really
  CONSTANT = :foo
  freeze
end

Really::CONSTANT = :bar
-> RuntimeError: can't modify frozen Module

Обратите внимание, что это не говорит об изменчивостизначения, присвоенного константе.Для этого используйте Object#freeze.

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

Как правило, защитное программирование в Ruby - это больше проблем, чем оно того стоит.Что тебя беспокоит?

...