常量是全局的,但它們生活在它們被定義的名稱空間中。
如果您在主環境中定義了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
更妙的是完全避免,只是lazy-常數根據需要加載東西:
class Foo
def self.config
@config ||= File.read(...)
end
end
Foo.config # => Your configuration
常量是最好的東西s不會改變,如SEPARATOR = ':'
,在不破壞大量代碼的情況下重新配置它們是不可能或不實際的。
如果您有從外部源讀取的內容,它可能會根據配置或偏好而有所不同,那麼通常使用中介方法更方便。
哇,這是一個很好的答案,並給了我很多關於事物範圍的見解。 Ruby是我第一次接觸任何面向對象的東西。在這種情況下,我將代碼中的「main」部分的配置加載到任何類的外部。我是否需要將配置移動到它自己的類中,還是在那種情況下還有其他一些「好」的方法來完成此操作? – Jericon
在自己的類中配置它使測試變得更容易,所以這可能是一個好主意。當配置本身包含在一個整潔的結構中,而不是散佈在數十個獨立變量中時,這也很好。 – tadman