Ruby 如何从函数初始化常量?

Ruby 如何从函数初始化常量?,ruby,Ruby,我正在写一个模块,它将使用。我希望能够设置DB常量,使其在全局名称空间中可用,但我无法找到一种非黑客方式来实现。以下是我目前掌握的情况: require 'sequel' module BB class Dal def initialize(db_url) self.class.connect(db_url) end def self.connect(db_url) @db = Sequel.connect( db_url )

我正在写一个模块,它将使用。我希望能够设置
DB
常量,使其在全局名称空间中可用,但我无法找到一种非黑客方式来实现。以下是我目前掌握的情况:

require 'sequel'

module BB

  class Dal    

    def initialize(db_url)
      self.class.connect(db_url)
    end

    def self.connect(db_url)
      @db = Sequel.connect( db_url )
    end
  end  

  BB::Dal.connect(ENV['DATABASE_URL']) if ENV['DATABASE_URL']
end

如您所见,我想启用两种初始化模式。通过
ENV['DATABASE\u URL']
变量或构造函数。我现在想做的是将
@db
替换为
db
。有什么想法吗?

如果您愿意,您可以将其从
模块
上下文中删除:

DB = BB::Dal.connect(ENV['DATABASE_URL']) if ENV['DATABASE_URL']
值得注意的是,在根命名空间中阻塞这些东西可能是一种糟糕的形式。您可能需要一个数据库连接模块来组织这些:

module DB
  def connection
    # Lazy initializer pattern applied here
    @connection ||= BB::Dal.connect(ENV['DATABASE_URL'])
  end
end

# ...

# Will connect the first time it's called, recycle the connection
# for all subsequent calls.
DB.connection.do_stuff

这真的取决于如何使用它。方法的优点是,如果出现这种情况,可以很容易地升级到连接池,而常量在函数方面非常严格,它必须返回一个奇异值,而没有机会首先运行代码。

如果从代码初始化,它实际上不是一个常量,是吗?单例或类方法在这里似乎更合适。在Sequel的文档中建议使用
DB
常量。问题是,如果我直接从
ENV
var初始化
DB
,我将无法提供传递连接字符串的选项,以防用户想要使用
ENV
变量以外的其他变量。Sequel的文档确实推荐了一些非常通用的方法,但是,如果你想做任何比这更遥远的事情,它很快就会崩溃。像我在这里建议的初始值设定项要灵活得多,允许您在提交连接调用之前设置任何需要的内容,例如读取配置文件、检查环境变量或其他内容。您可以在现有模块中实现所有这些,这样您就可以执行
BB::Dal.db
,而不用调用
connect