50

我已经用 Ruby 编程几个月了,我想知道什么时候适合在类变量上使用常量,反之亦然。(我在 Rails 工作,考虑模型中的常量)。

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

或者

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

是否存在一种优于另一种的情况?还是只是品味/风格的问题?

4

5 回答 5

57

主要的是,通过使用 CONSTANT 表示法,您可以让读者清楚地了解它。小写,冻结的字符串给人的印象是可能是可设置的,迫使某人回去阅读 RDoc。

于 2008-12-22T22:31:01.293 回答
11

如果这些确实是您在源代码中定义的常量值并且不想在代码执行期间更改,那么我建议使用常量。

如果您计划在执行期间动态设置和/或更改这些值,则将类变量与 getter 和 setter 一起使用。

于 2008-12-22T22:37:43.700 回答
8

基本上,你可以这样说:如果你想要一些不变的东西,那就使用一个常数。如果您想要可变的东西,请使用变量。看起来你的类型列表是常量,看到它是一个冻结的数组,所以我想说在这种情况下使用常量是有意义的。

于 2008-12-25T10:10:24.173 回答
2

如果您不希望值在程序运行时发生变化,并且您愿意允许在类之外访问该值,请使用常量。

否则,您可以使用类变量。但是,请注意类变量在子类和子类实例之间共享。因此,如果您将来可能会实现子类,则必须非常小心使用类变量。

有关更多信息,请参阅此处的答案:Ruby 中的类变量

于 2015-05-28T14:59:48.970 回答
2

请注意,类变量对于类及其实例是私有的(参见http://phrogz.net/programmingruby/tut_classes.html)。但是,如果您想将常量设为私有,您可以随时执行以下操作:

FOO = 18
private_constant :FOO
于 2018-09-28T16:05:04.773 回答