在另一个 Ruby 模块中使用方法
Using methods from one Ruby module in another
我已经提取了一些横切关注点,例如获取数据库连接、日志记录和应用程序配置到我的 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
有没有办法让我的数据库连接模块能够使用其他两个模块提供的方法?
您可以在 module
中尝试 module
,这样您就可以在模块之间使用现有的方法。
我能找到的例子很少
module inside a module
extending ruby module inside another module
以及有关 ruby 模块的更多信息 here and here
HTH
在Ruby中,模块可以充当mixins,其他模块可以从中继承。如果要使用模块的实例方法,则必须混入该模块。这是通过 Module#include
方法实现的:
module Connection
include Configuration, Logging
end
现在,Connection
继承自Configuration
和Logging
,因此Connection
的实例可以使用Configuration
和[=15=的所有方法] 除了 Connection
(和 Object
、BasicObject
、Kernel
)。
如果您还想访问 Connection
模块方法中的那些实例方法,那么您还需要 extend
Connection
和 Configuration
和 Logging
还有:
module Connection
extend Configuration, Logging
end
我已经提取了一些横切关注点,例如获取数据库连接、日志记录和应用程序配置到我的 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
有没有办法让我的数据库连接模块能够使用其他两个模块提供的方法?
您可以在 module
中尝试 module
,这样您就可以在模块之间使用现有的方法。
我能找到的例子很少
module inside a module
extending ruby module inside another module
以及有关 ruby 模块的更多信息 here and here
HTH
在Ruby中,模块可以充当mixins,其他模块可以从中继承。如果要使用模块的实例方法,则必须混入该模块。这是通过 Module#include
方法实现的:
module Connection
include Configuration, Logging
end
现在,Connection
继承自Configuration
和Logging
,因此Connection
的实例可以使用Configuration
和[=15=的所有方法] 除了 Connection
(和 Object
、BasicObject
、Kernel
)。
如果您还想访问 Connection
模块方法中的那些实例方法,那么您还需要 extend
Connection
和 Configuration
和 Logging
还有:
module Connection
extend Configuration, Logging
end