如何最佳地将Ruby类加载到应用程序中?

12

目前我正在使用 require 命令将 Ruby 类加载到每个类文件中,例如:

require File.join(File.dirname(__FILE__), 'observation_worker')
require File.join(File.dirname(__FILE__), 'log_worker')

对于每个类,我都定义了它所需的类。如果能在我的应用程序入口处完成这些定义就太好了。

有没有一种简单的方法可以在应用程序启动时加载所有Ruby类?

5个回答

12

如果你有一个相对清晰的目录结构来存放你的代码,你可以将特定的目录路径添加到加载路径中:

$LOAD_PATH.unshift( File.join( File.dirname(__FILE__), 'lib' ) )

那么在您的代码的其他部分,您可以像这样从相对路径进行要求:

require 'observation_worker'
require 'logger_worker'

或者如果你在 lib 文件夹中有子文件夹,你甚至可以这样做:

require 'workers/observation'
require 'workers/logger'

在我看来,这可能是处理库上下文中加载的最清晰的方法。


2

我不太确定是否完全理解了,因为您总是需要告诉您的程序需要哪些文件,但您可以这样做:

Dir["#{File.dirname(__FILE__)}/*.rb"].each { |f| require(f) }

这将包括当前文件目录中所有的.rb文件。虽然,如果您开始使用RDoc,它可能不会很满意。

通常情况下,明确列出您的requires并不是一件坏事,这使得阅读您代码的其他开发人员清楚地知道正在发生什么。


2
这里有一个我喜欢使用的选项。 http://github.com/dyoder/autocode/tree/master 来自Github文档。
  require 'autocode'

  module Application
    include AutoCode
    auto_load true, :directories => [ :configurations, :models, :views, :controllers ]
  end

这将尝试从给定的目录动态加载代码,使用模块名称确定要查找的目录。因此,Application::CustomerModel可以加载文件models/customer_model.rb。

另外,您可以查看Rails引导的方式。


1
参考autocode,"该代码库已不再使用,将很快被删除。请使用waves/autocode代码库。" - jtzero

1

看看这个类加载器

http://github.com/alexeypetrushin/class_loader

假设您有以下目录结构:
/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

1

正如jtzero所评论的那样,autoload已经被弃用了


您仍需要指定要加载的内容,但可以尝试使用autoload

autoload :Module, "module"

当常量Module首次被使用时,文件"module"将自动require

1
自动加载(autoload)已被废弃,请参考此链接 - jtzero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接