为什么我要用这个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