2014-02-18 31 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

相关问题