автозагрузка класса в модуле - PullRequest
0 голосов
/ 09 февраля 2019

В геме у меня есть файл

#/lib/my_gem/dym/proximity.rb
module MyGem
   module Dym
     class Proximity
     end
   end
end

Я пытаюсь загрузить его с помощью

module MyGem
   autoload 'Dym::Proximity', "my_gem/dym/proximity"
end

, что приводит к ошибке, что

NameError: autoload must be constant name: Dym::Proximity

или я также попытался

module MyGem
   autoload :Dym::Proximity, "my_gem/dym/proximity"
end

, что дает

TypeError: :Dym is not a class/module

и в любом случае :Dym::Proximity не является правильно сформированным символом.

Как мне это сделать

1 Ответ

0 голосов
/ 09 февраля 2019

Вы можете одновременно загружать только один уровень модуля, поэтому вам нужно ввести промежуточный файл.

То, как я заставил это работать, было путем введения файла с именем lib/my_gem/dym.rb, который автоматически загружает близость:

# console.rb
require_relative 'lib/my_gem'
# lib/my_gem.rb
module MyGem
  autoload :Dym, "./lib/my_gem/dym.rb"

  puts "The Dym::Proximity module isn't yet loaded!"
  Dym::Proximity
  puts "The Dym::Proximity module has been successfully loaded!"
end
# lib/my_gem/dym.rb
module MyGem
  module Dym
    autoload :Proximity, "./lib/my_gem/dym/proximity.rb"
  end
end
# lib/my_gem/dym/proximity.rb
module MyGem
  module Dym
    class Proximity
      puts 'Dym::Proximity module is loading!'
    end
  end
end

Со следующими файлами я получаюследующий вывод:

ruby console.rb
The Dym::Proximity module isn't yet loaded!
Dym::Proximity module is loading!
The Dym::Proximity module has been successfully loaded!

Итак, вы видите, что даже если вам пришлось вводить промежуточный файл, вы можете использовать несколько уровней модулей, и они будут каскадно и автоматически загружаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...