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