2009-04-29 25 views
49

我瞭解Ruby中require,loadautoload之間的細微差別,但我的問題是,您如何知道使用哪一個?何時在Ruby中使用`require`,`load`或`autoload`?

除了能夠在匿名模塊中「包裝」loadrequire似乎是首選。

但隨後autoload讓你懶加載文件 - 這聽起來很棒,但是我不知道你實際上得到什麼了require

一個方法優於其他?有一種方法脫穎而出嗎?

回答

50

通常,您應該使用requireload每次都會重新載入代碼,所以如果你從幾個模塊中完成,你將會做很多額外的工作。理論上懶惰的autoload聽起來不錯,但許多Ruby模塊做類似猴子修補其他類的事情,這意味着程序中無關部分的行爲可能取決於給定類是否已被使用。 autoload has also been deprecated,所以應該避免使用它。

如果您想讓自己的自動重新載入器在每次更改或每次有人點擊URL時進行加載(爲了開發目的,所以您不必每次都重新啓動服務器),然後使用load這是合理的。

+14

根據matz的[comment](http://www.ruby-forum.com/topic/3036681),我相信`autoload`在未來的Ruby版本中將被棄用。 – 2012-09-01 13:35:32

+2

請參閱下面鮑里斯的答案,其中包含有關自動載入的更新討論的鏈接。它仍然存在於2.1中:http://ruby-doc.org/core-2.1.0/Module.html#method-i-autoload – 2014-02-11 14:16:37

10

這裏是你獲得與autoload超過require什麼:

autoload主要是爲了加快您的Ruby程序和Rails應用程序的初始化階段。通過在需要的時候不加載資源,它可以加快事情的速度。

另一個優點是,如果用戶不使用某些功能,則可能不需要加載代碼的某些部分,從而縮短加載時間並減少內存佔用。

14

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> 

看到區別。

6

除了別人已經告訴過你,autoload的未來還不確定。它計劃在Ruby 2.0中被棄用,但2.0版功能凍結時沒有及時做出棄用。現在預計autoload將在Ruby 2.1,but that is not even certain anymore中被棄用。

相關問題