Ruby中配置对象的共享实例

时间:2014-05-04 17:40:53

标签: ruby

问题

我正在开发一个简单的Ruby CLI,需要将其配置信息存储在一个平面文件中。我有一个Configurator类来处理所有数据管理,保存到文件系统等。

尽管随意实例化Configurator个对象是完全合法的,但我也想提供一个共享实例(这样它在CLI中随处可用)。在Ruby中正确的方式似乎有很多的观点,而且我在游泳中游泳。 :(

我的第一次刺伤

configurator.rb

class Configurator
  attr_reader :config_path

  def initialize(path)
    @config_path = File.expand_path(path)
  end

  # ... more implementation
end

configuration.rb

module Configuration
  @@configuration = nil

  def configuration
    if @@configuration
      @@configuration
    else
      fail 'Attempted to access `configuration` before ' \
      'executing `load_configuration`'
    end

    def load_configuration(path)
      @@configuration = Configurator.new(path)
    end
end

了解这一点,我的Configuration模块可能会以这种方式使用:

include Configuration

# Initialize our shared Configurator.
Configuration.load_configuration('~/.app_config')

# Use it.
p configuration
# => #<Configurator:0x0000010126f8e8 @config_path="/Users/abach/.app_config">

我已经证实这是有效的,但有几个难闻的气味:

  1. 跑步Configuration.load_configuration感觉很奇怪;不知道怎么说。不过,这很可能是我的问题。 :)
  2. 在模块中使用类变量似乎也不对。
  3. 思考吗

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您是否为了学习如何做这样的事情而编写了配置管理,或者您只是想解决问题(需要将其配置信息存储在平面文件中的Ruby CLI )?

在后一种情况下,请查看the Ruby Toolbox,尤其是Configuration