Константы или переменные класса в Ruby?

я программирую в Ruby уже несколько месяцев, и мне интересно, когда целесообразно использовать константы над переменными класса и наоборот. (Я работаю в Rails, думая о константах в моделях).

class Category
  TYPES = %w(listing event business).freeze
end

или

class Category
  @@types = %w(listing event business).freeze
  cattr_reader :types
end

существуют ли обстоятельства, при которых одно предпочтительнее другого? Или это просто вопрос вкуса / стиля?

5 ответов


главное, что, используя постоянную нотацию, вы делаете это понятным для читателя. нижний регистр, замороженная строка создает впечатление might быть настраиваемым, заставляя кого-то вернуться и прочитать RDoc.


Если это действительно постоянные значения, которые вы определяете в исходном коде и не хотите изменять во время выполнения кода, я бы рекомендовал использовать constant.

Если вы планируете динамически устанавливать и/или изменять эти значения во время выполнения, используйте переменную класса с геттерами и сеттерами.


в принципе, вы можете сказать так: Если вы хотите что-то постоянное, используйте константу. Если вы хотите что-то переменное, используйте переменную. Похоже, что ваш список типов-константы, поскольку это замороженный массив, поэтому я бы сказал, что имеет смысл использовать константу в этом случае.


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

в противном случае, вы можете использовать переменную класса. Однако имейте в виду, что переменные класса являются общими для подклассов и экземпляров подклассов. Поэтому, если вы можете в какой-то момент в будущем реализовать дочерний класс, вы должны быть очень осторожны в использовании класса переменная.

см. ответы здесь для получения дополнительной информации об этом:переменные класса в Ruby


Если вы хотите сделать свой постоянный частный вы всегда можете сделать:

FOO = 18
private_constant :FOO