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
。