访问嵌套对象中的ruby变量

时间:2013-04-18 01:09:13

标签: ruby variables scope

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

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

1 个答案:

答案 0 :(得分: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 = ':',在不破坏大量代码的情况下重新配置它们是不可能或不实际的。

如果您从外部来源读取了某些内容,而这些内容可能会根据配置或偏好而有所不同,那么通常会更方便地使用一种方法来中介此内容。

相关问题