Ruby 全局缓存的全局变量vs.常量vs.类实例变量

Ruby 全局缓存的全局变量vs.常量vs.类实例变量,ruby,Ruby,一般来说,全局缓存哪个更好:全局变量、常量还是类实例变量 以下是每种方法的示例: module Foo $FOO_CACHE = {} def self.access_to_cache $FOO_CACHE end end module Foo CACHE = {} def self.access_to_cache CACHE end end module Foo @cache = {} def self.access_to_cache

一般来说,全局缓存哪个更好:全局变量、常量还是类实例变量

以下是每种方法的示例:

module Foo
  $FOO_CACHE = {}
  def self.access_to_cache
    $FOO_CACHE
  end
end

module Foo
  CACHE = {}
  def self.access_to_cache
    CACHE
  end
end

module Foo
  @cache = {}
  def self.access_to_cache
    @cache
  end
end

这最终是相当主观的,但我将逐一介绍每个选项:

  • 全局变量:不……因为将全局变量放在模块(或类,或任何相关内容)中没有多大意义,它将在任何地方都适用。除此之外,如果您可以使用全局变量以外的其他变量,那么您应该始终这样做

  • 常数:不…因为缓存不是常数!虽然Ruby没有强制执行常量不能更改,但这并不意味着您应该这样做。它们被称为常量是有原因的

  • 类实例变量:是的……因为它是这里唯一有意义的变量(虽然名称可能没有意义,但从技术上讲,它是一个模块实例变量,但这相当迂腐)。这是三个中唯一一个可以修改语义的,并且被某个范围封装的


很好的解释!但是,如果我想跨多个模块/类/文件使用/init变量,该怎么办?我不想使用类/模块实例变量,因为我不想仅仅为了使用其变量而初始化类。所以我有两个选择,类变量/常量或全局变量。在这种情况下使用哪一种更好?@Swaps正如我在回答中所说:如果您可以使用全局变量以外的其他变量,那么这是更好的选择(而且您几乎总是可以)。