我已经提取了一些跨领域的问题,例如在我的Ruby应用程序中将数据库连接,日志记录和应用程序配置分成单独的模块。我可以将它们包含在需要这些服务的类中。到目前为止,非常好。
我的问题是数据库连接模块需要日志记录和应用程序配置功能,所以理想情况下我希望它能够利用提供这些服务的现有模块,但我不知道如何实现这一点。如下所示,目前数据库连接模块中的代码不是很干。
connection.rb
module Connection
def connection
Connection.connection
end
def self.connection
@connection ||= begin
# Should use Configuration module here
config = YAML.load_file(File.join(__dir__, 'config.yml'))
@connection = Mysql2::Client.new(config['database'])
@connection.query_options.merge!(symbolize_keys: true)
@connection
rescue Mysql2::Error => err
# Should use Logging module here
logger = Logger.new($stdout)
logger.error "MySQL error: #{err}"
exit(1)
end
end
end
configuration.rb
module Configuration
def config
Configuration.config
end
def self.config
@config ||= YAML.load_file(File.join(__dir__, 'config.yml'))
end
end
logging.rb
module Logging
def logger
Logging.logger
end
def self.logger
@logger ||= Logger.new($stdout)
end
end
我的数据库连接模块是否有办法使用其他两个模块提供的方法?
答案 0 :(得分:1)
在Ruby中,模块可以充当 mixins ,其他模块可以从中继承。如果要使用模块的实例方法,则必须混合使用该模块。这是通过Module#include
方法实现的:
module Connection
include Configuration, Logging
end
现在,Connection
继承自Configuration
和Logging
,因此Connection
的实例可以使用Configuration
和Logging
中的所有方法除了Connection
(和Object
,BasicObject
,Kernel
)之外。
如果您还希望在Connection
的模块方法中访问这些实例方法,则还需要extend
Connection
Configuration
和Logging
module Connection
extend Configuration, Logging
end
}以及:
{{1}}
答案 1 :(得分:-1)
您可以在module
内尝试module
,这样您就可以在模块之间使用现有方法。
我找不到几个例子
extending ruby module inside another module
的更多信息HTH