为什么我要用这个Ruby模块得到一个NoMethodError?

为什么我要用这个Ruby模块得到一个NoMethodError?,ruby,module,worker,Ruby,Module,Worker,我正在编程一个分布式系统,其中一个工人执行一些工作,为了启动工人,启动了一个init.rb,加载lib文件夹并执行一些配置 结构 init.rb modulename.rb worker.rb 如果现在运行ruby init.rb我会得到一个NoMethodError::ModuleName的未定义方法配置:Module(NoMethodError) 我真的不明白为什么,请给我一个如何解决这个问题的提示 在modulename.rb中,您需要worker.rb,因此ruby将关闭并运行该文件中的

我正在编程一个分布式系统,其中一个工人执行一些工作,为了启动工人,启动了一个
init.rb
,加载
lib
文件夹并执行一些配置

结构 init.rb modulename.rb worker.rb 如果现在运行
ruby init.rb
我会得到一个NoMethodError:
:ModuleName的未定义方法配置:Module(NoMethodError)


我真的不明白为什么,请给我一个如何解决这个问题的提示

在modulename.rb中,您需要worker.rb,因此ruby将关闭并运行该文件中的代码,包括您设置的
REDIS_POOL
位,该位尝试调用
modulename.config

Modulename.config
尚未定义(您仅在Modulename.rb的底部定义,因此会出现错误)


您可能只想延迟创建redis池,或者至少在更新配置后创建redis池。

这是有道理的。我从运行配置代码之前需要Sinatra应用程序的地方获取了配置想法,为什么它在那里工作?可能在加载时他们不调用.config正在加载。如果您没有使用常量,而是使用
def self.redis_pool;..
我查看了源代码,他们只在方法定义中使用Integrity.config引用,那就好了,我不是,因为redispool常量是为类定义的。
def self.redis_pool;..
似乎使用起来最合理!
init.rb
lib
|-- modulename
|   |-- foo.rb
|   |-- configuration.rb
|   `-- worker.rb
`-- modulename.rb
$LOAD_PATH.unshift(File.expand_path("../lib", __FILE__))

require "bundler/setup"
require "modulename"

ModuleName.configure do |c|
    c.log       = "module.log"
    c.pool_size = 10
end
require "sidekiq"

require "modulename/foo"
require "modulename/configuration"
require "modulename/worker"

module ModuleName
    def self.config
        @config ||= Configuration.new
    end

    def self.configure
        yield(config)
    end
end
module ModuleName
    class Worker
        include Sidekiq::Worker

        REDIS_POOL = ConnectionPool.new(:size => ModuleName.config.pool_size, :timeout => 3) { Redis.new }

        def dosomething
            # ...
        end
    end
end