【发布时间】:2014-02-18 20:14:11
【问题描述】:
我想用 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 工作方式的自然延伸。
【问题讨论】:
-
OpenStruct使用method_missing来发挥它的魔力,如果你对性能没有问题,不妨看看它 -
小心使用 OpenStruct,因为它会很快消耗内存。我自己也经历过,但是See this Question
标签: ruby lazy-loading