Ruby 从类中包含的mixin访问类中定义的常量

Ruby 从类中包含的mixin访问类中定义的常量,ruby,Ruby,我有一个mixin(Api::Utility),它由两个类引用:Api::Utility::One::WorkstationClient和Api::Utility::two::WorkstationClient。这两个类都定义了一个常量,BASE\u URL,我想在mixin中访问它。当我试图访问该常量时,会出现一个错误,其内容为`namererror(未初始化的常量Epic::Api::Utility::BASE_URL) #/usr/bin/env ruby 模块Api 类Workstati

我有一个mixin(
Api::Utility
),它由两个类引用:
Api::Utility::One::WorkstationClient
Api::Utility::two::WorkstationClient
。这两个类都定义了一个常量,
BASE\u URL
,我想在mixin中访问它。当我试图访问该常量时,会出现一个错误,其内容为`namererror(未初始化的常量Epic::Api::Utility::BASE_URL)

#/usr/bin/env ruby
模块Api
类WorkstationClientFactory
def self.create_客户端(版本=:v2)
案例版本
时间:v2
两个::WorkstationClient.new()
时间:v1
一::WorkstationClient.new()
其他的
引发ArgumentError,“#{version.inspect}”不是有效的版本符号。有效:[:v1 |:v2]。”
结束
结束
结束#/WorkstationClientFactory
#Api::实用程序
模块实用程序
def棒
放置“基本URL:#{基本URL}”
结束
结束
单元一
#Api::One::WorkstationClient
类WorkstationClient
包含Api::实用程序
基本URL=https://domain.tld/api/v1'
def初始化()
放置“创建#{self.class.name}”
结束
结束#/WorkstationClient
完#一
单元二
#Api::Two::WorkstationClient
类WorkstationClient
包含Api::实用程序
基本URL=https://domain.tld/api/v2'
def初始化()
放置“创建#{self.class.name}”
结束
结束#/WorkstationClient
结束#/2
结束#/模块
v1=Api::WorkstationClientFactory.create_客户端(:v1)

v1.bar您可以使用
self.class::BASE\u URL

#!/usr/bin/env ruby

module Api

  class WorkstationClientFactory

    def self.create_client(version = :v2)
      case version
      when :v2
        Two::WorkstationClient.new()
      when :v1
        One::WorkstationClient.new()
      else
        raise ArgumentError, "'#{version.inspect}' is not a valid version symbol.  Valid: [:v1|:v2]."
      end
    end

  end # /WorkstationClientFactory

  # Api::Utility
  module Utility
    def bar
      puts "BASE_URL: #{BASE_URL}"
    end
  end

  module One
    # Api::One::WorkstationClient
    class WorkstationClient
      include Api::Utility

      BASE_URL = 'https://domain.tld/api/v1'

      def initialize()
        puts "Creating #{self.class.name}"
      end

    end # /WorkstationClient
  end # One

  module Two
    # Api::Two::WorkstationClient
    class WorkstationClient
      include Api::Utility

      BASE_URL = 'https://domain.tld/api/v2'

      def initialize()
        puts "Creating #{self.class.name}"
      end

    end # /WorkstationClient
  end # /Two

end # /module

v1 = Api::WorkstationClientFactory.create_client(:v1)
v1.bar <-- error here
BASE_URL: https://domain.tld/api/v1  <-- desired result

v2 = Api::WorkstationClientFactory.create_client(:v2)
v2.bar <-- error here
BASE_URL: https://domain.tld/api/v2  <-- desired result