使用另一个Ruby模块中的方法

时间:2015-01-11 12:10:12

标签: ruby module mixins

我已经提取了一些跨领域的问题,例如在我的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

我的数据库连接模块是否有办法使用其他两个模块提供的方法?

2 个答案:

答案 0 :(得分:1)

在Ruby中,模块可以充当 mixins ,其他模块可以从中继承。如果要使用模块的实例方法,则必须混合使用该模块。这是通过Module#include方法实现的:

module Connection
  include Configuration, Logging
end

现在,Connection继承自ConfigurationLogging,因此Connection的实例可以使用ConfigurationLogging中的所有方法除了Connection(和ObjectBasicObjectKernel)之外。

如果您还希望在Connection的模块方法中访问这些实例方法,则还需要extend Connection ConfigurationLogging module Connection extend Configuration, Logging end }以及:

{{1}}

答案 1 :(得分:-1)

您可以在module内尝试module,这样您就可以在模块之间使用现有方法。

我找不到几个例子

module inside a module

extending ruby module inside another module

以及有关ruby模块herehere

的更多信息

HTH