我正在使用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"

在“entering simple”和“finishing simple”输出之间,我不知道为什么没有得到configatron单例。
我错过了什么?

最佳答案

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'来解决这个问题,而不是使用monkey补丁,并提供自己的单例包装器。

关于ruby - configatron单例?为什么我不能在类里面访问configatron,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20623576/

10-13 02:17