configatron一个单身人士?为什么我不能在课堂上访问configatron

时间:2013-12-17 00:13:47

标签: ruby configatron

我正在使用configatron来存储我的配置值。我可以毫无问题地访问配置值,除非范围在类的方法中。

我正在使用configatron 3.0.0-rc1和ruby 2.0.0

以下是我在一个名为'tc_tron.rb'的文件中使用的来源

require 'configatron'

class TcTron  
  def simple(url)
    puts "-------entering simple-------"
    p url
    p configatron
    p configatron.url
    p configatron.database.server
    puts "-------finishing simple-------"
  end
end

# setup the configatron.  I assume this is a singleton
configatron.url = "this is a url string"
configatron.database.server = "this is a database server name"

# this should print out all the stuff in the configatron
p configatron
p configatron.url
p configatron.database.server

# create the object and call the simple method.
a = TcTron.new
a.simple("called URL")

# this should print out all the stuff in the configatron
p configatron
p configatron.url
p configatron.database.server

当我运行代码时,我得到了

{:url=>"this is a url string", :database=>{:server=>"this is a database server name"}}
"this is a url string"
"this is a database server name"
-------entering simple-------
"called URL"
{}
{}
{}
-------finishing simple-------
{:url=>"this is a url string", :database=>{:server=>"this is a database server name"}}
"this is a url string"
"this is a database server name"

在'输入简单'和'完成简单'输出之间我不知道为什么我没有得到configatron单身。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

configatron的当前实施是

module Kernel
  def configatron
    @__configatron ||= Configatron::Store.new
  end
end

来自here

由于Kernel中包含Object,因此该方法在每个对象中都可用。但是,b / c方法只是设置一个实例变量,该存储只能用于每个实例。一个宝石的奇怪选择,其整个工作是提供一个全球可访问的商店。

在v2.4中,他们使用类似的方法来访问单例,这可能效果更好

module Kernel
  # Provides access to the Configatron storage system.
  def configatron
    Configatron.instance
  end
end

来自here

看起来你可以使用require 'configatron/core'来解决这个问题,而不是使用猴子补丁,并提供你自己的单身包装。