何时在Rails中调用“require”?

我在Rails中有一个更概念性的问题……或Ruby:

最好在需要它的方法之前调用require,在Rails启动时将我的需要分组在类的开头或初始化器的某个地方?

从性能的角度来看是否重要? 从可读性的角度来看? 如果我使用Rails 3,它会有所作为吗?

谢谢!

如果您担心性能,那么您应该在需要它们的上下文中要求这些内容,这样如果不执行代码的那部分,则不会加载库。 任何后续的require调用都不起作用,因为该文件已被加载。 这最终看起来像是:

 if (user.using_openid?) require 'openid' # ... Do OpenID stuff end 

虽然这在资源方面更有效,但是很难确定应用程序的依赖性。 声明这些预先设置使其他人维护该软件变得清晰。 请记住,当您忘记应用程序的某些细节时,“其他人”总是包含您未来的自我。

从技术上讲,您可以在任何时间,迟到或早期要求任何东西,但从设计角度来看,事先声明您的要求会更好。 如果您发现某个元素只是间歇性地使用并且需要花费不寻常的时间或内存来加载,那么您应该在需求文件中预先记录该元素。 例如:

 require 'library1' require 'library2' require 'library3' require 'library4' require 'library5' # Other libraries loaded as required: # * slowimagelibrary # * slowencryptionlibrary # * openid 

可以说这对Bundler来说不是一个问题,因为你可以更正式地宣布你的gem,并且实际的require调用可以在以后进行。

如果你考虑vanilla Ruby,’require’主要用在第一行,因为你确定你可以访问你需要的东西,并且更容易找到和读取你需要的依赖。

在某些情况下,您只想在方法中加载gem,因为您的脚本不需要这样做(例如:可选的可视化)。

有了Rails,我相信这取决于你想做什么。

如果你使用Bundler,你可以假设你的gem已经被“需要”(你当然可以覆盖:require选项所需的内容)。

如果你想在服务器启动时自动加载某些东西(比如validation器或表单构建器),那么你应该看看如何处理config(autoload_paths和eager_load_paths)。

require也可以用于加载gem的一部分,就像它的扩展一样。 然后,当然需要配置的位置。

如果您在multithreading环境中工作,可能会担心,因为它们存在一些问题。 然后,必须确保在线程运行之前加载了所有内容。 (像类常量一样加载,但方法还没有,有一篇好文章,但我再也找不到它了)。

您可能还想尝试{Module,Kernel} .autoload,Rails广泛使用它来加载访问时所需的内容(但它看起来相当难看)。

你也可以使用const_missing自己破解它(所以如果你接受一个结构,这可以做普通的延迟加载)。 这是一个简单的例子(不适合嵌套类)。

 def Object.const_missing c if (file = Dir["#{c.downcase}.rb"]).size == 1 require_relative(file) end if const_defined? c const_get c else super # Object < Module end end 

关于性能,对require的调用相对较贵,因此如果您知道要使用它,请尽可能只执行一次。 但是,要管理项目中的复杂依赖项,可能需要相关文件。 那么require_relative就是1.9的方法。

最后,对于一个项目,我建议在lib /的主文件中要求all,并使用一些Dir["**/*.rb"]表达式。 那么你很少需要require_relative ,因为只有在类的主体中引用另一个常量时才需要它(方法的所有内容都没有被解析,因此没有问题)。

另一种解决方案是在主文件中定义这些常量,它还可以让您了解结构。