1

我有一颗正在研究的宝石。它是一个解析配置文件然后实例化几个对象的可执行文件。然后这些对象之一实例化许多“处理程序”对象。我正在将配置文件解析为一个数组,CONFIG但其中的设置在任何其他对象中都无法访问。处理程序中需要它们。当我尝试使用它们时,变量不存在。

我知道这是一个可变范围问题。但是,我不确定我需要做什么才能使这些在整个程序(包括子/嵌套对象)中都可以访问,而不仅仅是初始可执行文件。虽然程序中的每个对象都在一个模块中,但可执行文件中的操作却不是。

4

1 回答 1

1

常量是全局的,但它们存在于定义它们的命名空间中。

如果您CONFIG在主上下文中定义,它将在根级别是全局的。如果在类或模块中定义它,则必须在该上下文之外通过其全名引用它。

例如:

class Foo
  CONFIG = File.read(...)
end

CONFIG # => Error, not defined
Foo::CONFIG # => Defined

按名称引用常量通常是不好的形式,它们违背了正确的面向对象设计的原则。因此,如果您定义常量,它们应该只在内部使用,并通过子类可以根据需要重新定义或修补的方法公开。

一个更好的例子:

class Foo
  CONFIG = File.read(...)

  def self.config
    CONFIG
  end
end

Foo.config # => Your configuration

这个简单的抽象很重要,因为子类可以重新定义您的配置:

class Bar < Foo
  def self.config
    # ... Different implementation
  end
end

Bar.config # => Different result

更好的是完全避免常量,并根据需要简单地延迟加载:

class Foo
  def self.config
    @config ||= File.read(...)
  end
end

Foo.config # => Your configuration

常量最好保留给不会改变的东西,例如SEPARATOR = ':',在不破坏大量代码的情况下重新配置它们是不可能或不切实际的。

如果您有从外部源读取的内容,并且可能会根据配置或偏好而有所不同,那么使用中间的方法通常会更方便。

于 2013-04-18T01:46:25.680 回答