我有一个混合类(Api::Utility
),该类由两个类:Api::Utility::One::WorkstationClient
和Api::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
?
答案 0 :(得分:2)
您可以使用self.class::BASE_URL
。