何时在Ruby中使用常量而不是实例变量?

tor*_*rie 0 ruby variables constants instance

我知道实例变量的意思是状态,而常量意味着不变.是否有任何理由(除了惯例)使用常量而不是实例变量?使用常量是否有内存/速度优势?

tad*_*man 5

这里有几件事需要考虑:

  • 价值会在对象的生命周期内发生变化吗?
  • 你需要覆盖子类中的值吗?
  • 您是否需要在运行时配置该值?

最好的常量是那些没有真正改变软件更新的常量:

class ExampleClass
  STATES = %i[
    off
    on
    broken
  ].freeze
end
Run Code Online (Sandbox Code Playgroud)

通常,您在类中内部使用这些常量,并避免共享它们.当你分享它们时,你的使用方式受到限制.例如,如果引用了另一个类,则ExampleClass::STATES无法在不更改其他代码的情况下更改该结构.

您可以通过提供接口使其更加抽象:

class ExampleClass
  def self.states
    STATES
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您将来更改该常量的结构,则可以始终保留旧行为:

class ExampleClass
  STATES = {
    on: 'On',
    off: 'Off',
    broken: 'Broken'
  }.freeze

  def self.states
    STATES.keys
  end
end
Run Code Online (Sandbox Code Playgroud)

当您谈论实例变量时,您指的是可以配置的内容:

class ConfigurableClass
  INITIAL_STATE_DEFAULT = :off

  def self.initial_state
    @initial_state || INITIAL_STATE_DEFAULT
  end

  def self.initial_state=(value)
    @initial_state = value ? value.to_sym
  end
end
Run Code Online (Sandbox Code Playgroud)

常量是很好的,因为它们被定义一次并在过程的持续时间内使用,所以从技术上来说它们更快.实例变量仍然非常快,并且通常是必需的,如上所述.