Ruby 从类中包含的mixin访问类中定义的常量
我有一个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
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