使用常量或类变量?

时间:2012-01-07 02:16:22

标签: ruby-on-rails ruby scope constants class-variables

我在页面上显示了许多导航链接。 它将在应用程序中修复,但将来可能会发生变化,但不能以交互方式进行,只要新版本更改它即可。所以在使用中的应用程序中修复了。

链接数设置为在控制器中的许多不同操作中使用。

我是否应该使用类级别变量@@number_of_link来使其保持在类中并允许相同名称的其他用途(不同的控制器和模型说)没有冲突(即作用域),或者我应该使用常数如NumberOfLinks

我已经得到了两者的建议,并希望确认我对第一个的偏好。

5 个答案:

答案 0 :(得分:4)

除非它不变,否则绝对不是常数!

我建议使用类实例变量,而不是类变量。您可以获得类变量的所有好处,甚至可以获得更好的范围(类的其他成员不会破坏该值,也更容易访问。

class Foo

  class << self
    def number_of_links
      @number_of_links ||= 10 # or some sensible default, you might make this a constant to highlight the number when you're reading the code.
    end

    def number_of_links=( n )
      @number_of_links = n
    end
  end
end

puts Foo.number_of_links
# => 10
Foo.number_of_links = 20

puts Foo.number_of_links
# => 20

请参阅http://blog.codegram.com/2011/4/understanding-class-instance-variables-in-ruby了解更多信息。

答案 1 :(得分:2)

如果仅使用新版软件更改,则将其设为常量。这更好地反映了该价值的意图。

应用程序逻辑不会更改的值不需要是瞬态变量。我尽可能避免使用类变量(和类实例变量),因为许多开发人员无法理解两者之间的差异,何时使用它们等等。

答案 2 :(得分:2)

就像Iain说..使用类实例变量 ..但你可以使用attr_accessor减少代码

class Foo
  class << self; attr_accessor :number_of_links; end
  self.number_of_links = 10 #default value..
end

puts Foo.number_of_links
# => 10
Foo.number_of_links = 20

puts Foo.number_of_links
# => 20

答案 3 :(得分:1)

如果您不打算使用应用程序逻辑进行修改,那么您应该使用常量。

如果你希望随着类的状态改变它(如果根据数据库交互的状态推断它),你应该使用类变量。

从性能的角度来看,无关紧要,在这种情况下,按照上面描述的方式使用它,您可以使用变量类型来假设意图,这使得开发人员更容易理解而无需“解码”。

答案 4 :(得分:0)

假设您需要更新链接数量,如果您通过常量ruby执行此操作将发出警告,例如“警告:已初始化常量NumOfLinks”

在这种情况下你应该坚持使用类变量。