将Ruby类加载到应用程序中的最佳方法是什么?

将Ruby类加载到应用程序中的最佳方法是什么?,ruby,Ruby,目前,我正在使用require命令将Ruby类加载到每个类文件中,例如: require File.join(File.dirname(__FILE__), 'observation_worker') require File.join(File.dirname(__FILE__), 'log_worker') 对于每个类,我定义它所需要的类。如果我能在我的应用程序的入口点这样做,那就太好了 有没有一种简单的方法可以在应用程序开始时加载所有Ruby类?我不确定是否完全理解,因为您总是需要告诉您

目前,我正在使用require命令将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存储库。”