在另一个 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继承自ConfigurationLogging,因此Connection的实例可以使用Configuration和[=15=的所有方法] 除了 Connection(和 ObjectBasicObjectKernel)。

如果您还想访问 Connection 模块方法中的那些实例方法,那么您还需要 extend ConnectionConfigurationLogging 还有:

module Connection
  extend Configuration, Logging
end