Константы или переменные класса в ruby? - PullRequest
46 голосов
/ 23 декабря 2008

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

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

OR

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

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

Ответы [ 5 ]

55 голосов
/ 23 декабря 2008

Главное, что, используя обозначение CONSTANT, вы делаете его понятным для читателя. в нижнем регистре замороженная строка создает впечатление, что может быть настраиваемым, заставляя кого-то вернуться и прочитать RDoc.

10 голосов
/ 23 декабря 2008

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

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

8 голосов
/ 25 декабря 2008

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

1 голос
/ 28 мая 2015

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

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

Подробнее об этом см. Здесь: Переменные класса в Ruby

0 голосов
/ 28 сентября 2018

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

FOO = 18
private_constant :FOO
...