Ruby中的require、load、autoload

require、load、autoload是Kernel模塊中定義的方法,因爲Class類和Object類都混入了Kernel模塊,因此不管self是對象仍是類,均可以調用這些方法。html

這三個方法都用來加載和執行其餘文件,可是有細微的不一樣,本文將從參數、函數執行、返回值三個方面簡要介紹下這三個函數。ruby

1. require(name) -> true or false or raise LoadError

http://ruby-doc.org/core-2.1.2/Kernel.html#method-i-require函數

  • name能夠是絕對路徑,也能夠是相對路徑。Ruby會自動爲name補充擴展名(.rb, .so, .etc);
  • 函數執行時,若是name是絕對路徑,則會去查找該文件;
  • 一般name是相對路徑,Ruby會在$:中的目錄中搜索該文件。因此一般須要$:.unshift添加搜索路徑;
  • 找到該文件後,會運行該文件,並把該文件的絕對路徑加入全局變量$"中,以此保證不重複加載;
  • 第一次加載返回true,已經加載返回false,找不到文件會拋出LoadError

2. load(filename, wrap=false) -> true or raise LoadError

http://ruby-doc.org/core-2.1.2/Kernel.html#method-i-loadui

  • filename能夠是絕對路徑,也能夠是相對路徑。Ruby不會爲filename添加擴展名;
  • 函數執行時,若是filename是絕對路徑,則會去查找該文件
  • 一般filename是相對路徑,Ruby會在$:中的目錄中搜索該文件。因此一般須要$:.unshift添加搜索路徑;
  • wrap爲true時,被加載文件會在一個匿名模塊中執行,避免污染;
  • load會加載文件並執行,成功會返回true,找不到文件會拋出LoadError。

3. autoload(module, filename) -> nil or raise LoadError

http://ruby-doc.org/core-2.1.2/Kernel.html#method-i-autoloadspa

  • 將filename與module關聯,當第一次使用module時,使用require加載該文件;
  • 執行過程與require同樣;
  • 成功返回nil,找不到文件會拋出LoadError。

4. 總結

這三個方法共同點:htm

  • 會搜索$:來尋找目標文件,找不到會拋出LoadError。

這三個方法大體能夠以下區分:對象

  • require避免重複加載,無需指定擴展名;
  • load會重複加載,需指定擴展名;
  • autoload會在須要時用require加載,能避免重複加載,無需指定擴展名。

所以autoload反而更像require。get

相關文章
相關標籤/搜索