我瞭解Ruby中require
,load
和autoload
之間的細微差別,但我的問題是,您如何知道使用哪一個?何時在Ruby中使用`require`,`load`或`autoload`?
除了能夠在匿名模塊中「包裝」load
,require
似乎是首選。
但隨後autoload
讓你懶加載文件 - 這聽起來很棒,但是我不知道你實際上得到什麼了require
一個方法優於其他?有一種方法脫穎而出嗎?
我瞭解Ruby中require
,load
和autoload
之間的細微差別,但我的問題是,您如何知道使用哪一個?何時在Ruby中使用`require`,`load`或`autoload`?
除了能夠在匿名模塊中「包裝」load
,require
似乎是首選。
但隨後autoload
讓你懶加載文件 - 這聽起來很棒,但是我不知道你實際上得到什麼了require
一個方法優於其他?有一種方法脫穎而出嗎?
通常,您應該使用require
。 load
每次都會重新載入代碼,所以如果你從幾個模塊中完成,你將會做很多額外的工作。理論上懶惰的autoload
聽起來不錯,但許多Ruby模塊做類似猴子修補其他類的事情,這意味着程序中無關部分的行爲可能取決於給定類是否已被使用。 autoload
has also been deprecated,所以應該避免使用它。
如果您想讓自己的自動重新載入器在每次更改或每次有人點擊URL時進行加載(爲了開發目的,所以您不必每次都重新啓動服務器),然後使用load
這是合理的。
這裏是你獲得與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>
看到區別。
除了別人已經告訴過你,autoload
的未來還不確定。它計劃在Ruby 2.0中被棄用,但2.0版功能凍結時沒有及時做出棄用。現在預計autoload
將在Ruby 2.1,but that is not even certain anymore中被棄用。
根據matz的[comment](http://www.ruby-forum.com/topic/3036681),我相信`autoload`在未來的Ruby版本中將被棄用。 – 2012-09-01 13:35:32
請參閱下面鮑里斯的答案,其中包含有關自動載入的更新討論的鏈接。它仍然存在於2.1中:http://ruby-doc.org/core-2.1.0/Module.html#method-i-autoload – 2014-02-11 14:16:37