【发布时间】:2009-04-29 21:12:38
【问题描述】:
我了解 Ruby 中 require、load 和 autoload 之间的细微差别,但我的问题是,您怎么知道该使用哪一个?
除了能够在匿名模块中“包装”load 之外,require 似乎是首选。
但是autoload 允许你延迟加载文件——这听起来很棒,但我不确定你实际上比require 获得了什么
一种方法优于另一种方法吗?是否存在一种方法脱颖而出的情况?
【问题讨论】:
我了解 Ruby 中 require、load 和 autoload 之间的细微差别,但我的问题是,您怎么知道该使用哪一个?
除了能够在匿名模块中“包装”load 之外,require 似乎是首选。
但是autoload 允许你延迟加载文件——这听起来很棒,但我不确定你实际上比require 获得了什么
一种方法优于另一种方法吗?是否存在一种方法脱颖而出的情况?
【问题讨论】:
一般情况下,您应该使用require。 load 每次都会重新加载代码,所以如果你从几个模块中加载,你会做很多额外的工作。 autoload 的懒惰在理论上听起来不错,但是许多 Ruby 模块会做猴子修补其他类之类的事情,这意味着程序中不相关部分的行为可能取决于给定类是否已被使用。
如果您想创建自己的自动重新加载器,在每次代码更改或每次有人点击 URL 时加载您的代码(出于开发目的,因此您不必每次都重新启动服务器),然后使用 load因为这是合理的。
【讨论】:
autoload (bugs.ruby-lang.org/issues/5653#note-46)。
除了别人已经告诉你的,autoload 的未来是不确定的。它计划在 Ruby 2.0 中被弃用,但在 2.0 功能冻结时没有及时弃用。现在预计 autoload 将在 Ruby 2.1 中被弃用,but that is not even certain anymore。
【讨论】:
autoload 不会被弃用。 bugs.ruby-lang.org/issues/5653#note-46
autoload 比 require 获得的收益如下:
autoload 主要用于加快 Ruby 程序或 Rails 应用程序的初始化阶段。通过在需要资源之前不加载资源,它可以大大加快速度。
另一个优点是,如果用户不使用某些功能,您可能不需要加载代码的某些部分,从而缩短加载时间并减少内存占用。
【讨论】:
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>
看看区别。
【讨论】: