何时在Ruby中使用`require`,`load`或`autoload`?

时间:2009-04-29 21:12:38

标签: ruby module

我理解Ruby中requireloadautoload之间的微妙差异,但我的问题是,您如何知道使用哪一个?

除了能够在匿名模块中“包裹”load之外,require似乎更受欢迎。

但是autoload允许你延迟加载文件 - 这听起来很棒,但我不确定你获得了多少require

一种方法优于另一种吗?是否存在一种方法脱颖而出的情况?

4 个答案:

答案 0 :(得分:60)

通常,您应该使用requireload每次都会重新加载代码,所以如果你从几个模块中执行它,你将会做很多额外的工作。 autoload的懒惰在理论上听起来很不错,但许多Ruby模块都做了猴子修补其他类的事情,这意味着程序中不相关部分的行为可能取决于给定的类是否已被使用。 autoload is in the process of being deprecated,因此应避免使用它。

如果您想制作自己的自动重新加载器,每次更改时或每次有人点击URL时加载您的代码(为了开发目的,您不必每次都重新启动服务器),然后使用{{1这是合理的。

答案 1 :(得分:17)

mylibrary.rb

puts "I was loaded!"

class MyLibrary
end

尝试irb

irb(main):001:0> require 'mylibrary'
I was loaded!
=> true

irb(main):001:0> autoload :MyLibrary, 'mylibrary'
=> nil
irb(main):002:0> MyLibrary.new
I was loaded!
=> #<MyLibrary:0x0b1jef>

看到差异。

答案 2 :(得分:11)

这是autoload超过require获得的收益:

autoload主要用于加速Ruby程序或Rails应用程序的初始化阶段。通过不加载资源直到需要它们,它可以加速一些事情。

另一个优点是,如果用户不使用某些功能,您可能不需要加载代码的某些部分 - 从而缩短加载时间并减少内存占用。

答案 3 :(得分:7)

除了其他人已经告诉过你的内容之外,autoload的未来还不确定。它计划在Ruby 2.0中弃用,但是对于2.0功能冻结没有及时弃用。现在预计将在Ruby 2.1,but that is not even certain anymore中弃用autoload