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

时间:2018-09-25 19:44:40

标签: ruby

我有一个混合类(Api::Utility),该类由两个类:Api::Utility::One::WorkstationClientApi::Utility::Two::WorkstationClient引用。这两个类都定义了一个常量BASE_URL,我想在mixin中访问它。当我尝试访问该常量时,出现一个错误,提示内容为:NameError(未初始化的常量Epic :: Api :: Utility :: BASE_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

在这种情况下,如何在mixin中访问BASE_URL

1 个答案:

答案 0 :(得分:2)

您可以使用self.class::BASE_URL