ruby - 自动加载模块中的类
问题描述
在宝石中我有一个文件
#/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
是一个格式良好的符号。
我该怎么做呢?
解决方案
您一次只能自动加载一个模块级别,因此您需要引入一个中间文件。
我让它工作的方法是引入一个名为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!
所以你会看到,即使你必须引入一个中间文件,你现在也可以使用多个模块级别,它们将级联和自动加载。
推荐阅读
- angular - Angular Material扩展面板:多重扩展
- python - python bokeh不包括轴限制中的Span
- laravel - Unable to send email using swiftmailer library. Getting Expected response code 250 but got code "550". How to fix this?
- python-3.x - 在 Python 中选择基于多个工作日名称的数据
- asp.net - 如何使用 Visual Studio 开发服务器调试 64 位应用程序
- android - 将密钥库和应用程序与具有多个应用程序的旧密钥库分开
- optaplanner - VRP 与团队建设
- python - 如何从 json 文件的依赖项中读取 python 工具并在 python 解包时安装它?
- c# - IIS Express Asp.Net 长 URL 返回 400 Bad Request
- wordpress - Wordpress 中的恶意代码(恶意重定向)