Я искал все вокруг и не нашел никакого ответа на проблему, с которой я столкнулся в Ruby. Я пишу приложение, которое использует наборы основных модулей, которые доступны в разных версиях. Если я выбираю версию базового набора за другой, обе версии кода будут исходить из одного и того же и будут sh друг с другом. Это вполне нормально, и я согласен с этим.
Один из подходов может состоять в том, чтобы выгрузить предыдущую версию, чтобы загрузить новую, но я бы хотел, чтобы все они были загружены в определенные c пространства имен ( чтобы избежать трудоемкой выгрузки / перезагрузки кода все время). 2 возможных решения для меня (или, возможно, другого)
- Либо введите код, затем переместите его в пространство имен версии (некоторые подсказки, чтобы сделать это, см. Ниже, но пока не работает)
- Или исходный код непосредственно в пространство имен версии (не знаю, как это сделать точно, возможно, с помощью module_eval, но нужно перекодировать требуемый процесс с зависимостями). Кажется ли возможным какое-либо решение?
Вот очень простое po c того, что я пытаюсь достичь
file: coreset_1.0.0.rb
module CoreA
def self.who_am_i?; self.to_s; end
def self.get_coreb; CoreB end
end
module CoreB
def self.who_am_i?; self.to_s; end
end
файл: coreset_2.0.0.rb (есть некоторые изменения)
module CoreA
def self.my_name; self.to_s; end
def self.get_coreb; CoreB end
end
module CoreB
def self.my_name; self.to_s; end
end
файл: coreManager.rb
module CoreManager
def self.load_version(arg_version)
#Create a module set for the selected version
core_set_name = CoreSet + '_' + arg_version.gsub('.', '_')
core_set = eval("Module #{core_set_name}; end; #{core_set_name}"
#Load the requested code
require "coreset_#{arg_version}.rb"
#Move loaded code into it core set module
core_set.const_set(:CoreA, Object.send(:remove_const, :CoreA))
core_set.const_set(:CoreB, Object.send(:remove_const,:CoreB))
#Return the created core set
core_set
end
end
Если работает код:
require 'coreManager.rb'
core_set = CoreManager.load_version("1.0.0")
puts core_set::CoreA.who_am_i?
puts core_set::CoreA.get_coreB
, он возвращает:
CoreA #not CoreSet_1_0_0::CoreA
uninitialized constant CoreA::CoreB (NameError)
Если работает что-то статически определенное, это работает
module CoreSet
module CoreA
def self.who_am_i?; self.to_s; end
def self.get_coreb; CoreB end
end
module CoreB
def self.who_am_i?; self.to_s; end
end
end
CoreSet::CoreA.get_coreb
Возвращается, как и ожидалось:
CoreSet::CoreB
Несмотря на то, что обычно говорят: «модуль является константой», кажется, что это нечто большее. В чем различия и как заставить работать версию Dynami c?
Любые другие идеи?
Спасибо за помощь, ребята:)