2014-02-18 28 views
2

我想用Ruby做一些配置文件工作。配置中的一些元素名義上取決於其他元素,但不一定。我可以創建一個透明地顯示方法和變量的類嗎?

例如,使用配置的時候,我想這樣做:

require_relative "config" 
require_relative "overrides" 
dosomething_with(Config.libpath) 

在 「配置」,我想是這樣的:

require 'ostruct' 
Config = OpenStruct.new 
Config.basepath = "/usr" 
Config.libpath = lambda {Config.basepath + "/lib"} # this is not quite what I want 

在 「覆蓋」 後,用戶可能會覆蓋Config.basepath,我想讓Config.libpath採取自然的值。但用戶可能覆蓋Config.libpath到一些常數。

我希望能夠只說Config.libpath並獲得計算值(如果它沒有被覆蓋)或定義的值(如果有的話)。

這是我會用Ruby做的事嗎?這看起來像是我看到OpenStruct工作的一個自然延伸。

+0

'OpenStruct'使用'method_missing'它的魔力,你不妨看看,如果你沒有與性能問題 – bjhaid

+0

小心OpenStruct爲它會很快消耗內存。我已經親身體驗過,但[請參閱此問題](http://stackoverflow.com/questions/1177594/ruby-struct-vs-openstruct/4137908#4137908) – engineersmnky

回答

2

這個什麼:

require 'ostruct' 

Config = OpenStruct.new 
Config.basepath = "/usr" 

def Config.libpath 
    # Suggested by Nathaniel himself 
    @table[:libpath] || basepath + "/lib" 

    # The next alternatives require def Config.libpath=(libpath) ... 
    # instance_variable_defined?(:@libpath) ? @libpath : basepath + "/lib" 
    # or 
    # @libpath || basepath + "/lib" , depending on your needings 
end 

# Needed only if @table[:libpath] is not used 
# def Config.libpath=(libpath) 
# @libpath = libpath 
# end 

# Default basepath, default libpath 
p Config.libpath #=> "/usr/lib" 

# custom basepath, default libpath 
Config.basepath = "/var" 
p Config.libpath #=> "/var/lib" 

# Custom libpath 
Config.libpath = '/lib' 
p Config.libpath #=> "/lib" 
+0

正是我正在尋找!我偷看了OpenStruct的源代碼,似乎可以使用'@table [:libpath]'而不是'@ libpath',然後我不需要定義'libpath ='方法。 –

+0

噢,是的,我曾經看過它,你提醒我使用@table,我更新答案=) – mdesantis

相關問題