首页 > 解决方案 > 自动加载模块中的类

问题描述

在宝石中我有一个文件

#/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是一个格式良好的符号。

我该怎么做呢?

标签: ruby

解决方案


您一次只能自动加载一个模块级别,因此您需要引入一个中间文件。

我让它工作的方法是引入一个名为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!

所以你会看到,即使你必须引入一个中间文件,你现在也可以使用多个模块级别,它们将级联和自动加载。


推荐阅读