将Ruby类加载到应用程序中的最佳方法是什么?
目前,我正在使用require命令将Ruby类加载到每个类文件中,例如:将Ruby类加载到应用程序中的最佳方法是什么?,ruby,Ruby,目前,我正在使用require命令将Ruby类加载到每个类文件中,例如: require File.join(File.dirname(__FILE__), 'observation_worker') require File.join(File.dirname(__FILE__), 'log_worker') 对于每个类,我定义它所需要的类。如果我能在我的应用程序的入口点这样做,那就太好了 有没有一种简单的方法可以在应用程序开始时加载所有Ruby类?我不确定是否完全理解,因为您总是需要告诉您
require File.join(File.dirname(__FILE__), 'observation_worker')
require File.join(File.dirname(__FILE__), 'log_worker')
对于每个类,我定义它所需要的类。如果我能在我的应用程序的入口点这样做,那就太好了
有没有一种简单的方法可以在应用程序开始时加载所有Ruby类?我不确定是否完全理解,因为您总是需要告诉您的程序它需要什么文件,但您可以执行以下操作:
Dir["#{File.dirname(__FILE__)}/*.rb"].each { |f| require(f) }
其中将包括当前文件目录中的所有.rb文件。
尽管如果您开始使用RDoc,它不会对您感到满意
明确列出您的需求通常不是一件坏事,它可以让阅读您代码的其他开发人员清楚地了解正在发生的事情。正如jtzero所评论的,autoload已被弃用
您仍然需要指定要加载的内容,但可以尝试自动加载
autoload :Module, "module"
当常量
模块
首次使用时,文件“模块”
将自动成为require
d。如果您的代码所在的目录结构比较清晰,可以向加载路径添加特定的目录路径,如
$LOAD_PATH.unshift( File.join( File.dirname(__FILE__), 'lib' ) )
然后,在代码的其他部分中,您可能需要这样一个相对路径:
require 'observation_worker'
require 'logger_worker'
或者,如果您在lib中有文件夹,您甚至可以这样做
require 'workers/observation'
require 'workers/logger'
在我看来,这可能是在库的上下文中处理加载的最干净的方法。这里有一个我喜欢使用的选项 从github文档
require 'autocode'
module Application
include AutoCode
auto_load true, :directories => [ :configurations, :models, :views, :controllers ]
end
这将尝试从给定的目录动态加载代码,使用模块名确定要加载的目录
要查找的目录。因此,Application::CustomerModel可以加载文件models/customer\u model.rb
此外,您还可以检查rails引导的方式。检查这个类加载器 假设您具有以下目录结构
/your_app
/lib
/animals
/dog.rb
/zoo.rb
只要将ClassLoader指向应用程序的根目录,它就会自动查找并加载所有其他类
require 'class_loader'
autoload_dir '/your_app/lib'
Zoo.add Animals::Dog.new # <= all classes loaded automatically
require'class_loader'
自动加载目录“/你的应用程序/lib”
Zoo.add Animals::Dog.new#作为参考,autoload is for reference是“此respository不再使用,将很快删除。请使用waves/autocode存储库。”