標籤:style http 使用 os strong 檔案 ar html
require、load、autoload是Kernel模組中定義的方法,由於Class類和Object類都混入了Kernel模組,所以無論self是對象還是類,都可以調用這些方法。
這三個方法都用來載入和執行其他檔案,但是有細微的不同,本文將從參數、函數執行、傳回值三個方面簡要介紹下這三個函數。
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-load
- 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-autoload
- 將filename與module關聯,當第一次使用module時,使用require載入該檔案;
- 執行過程與require一樣;
- 成功返回nil,找不到檔案會拋出LoadError。
4. 總結
這三個方法共同點:
- 會搜尋$:來尋找目標檔案,找不到會拋出LoadError。
這三個方法大致可以如下區分:
- require避免重複載入,無需指定副檔名;
- load會重複載入,需指定副檔名;
- autoload會在需要時用require載入,能避免重複載入,無需指定副檔名。
因此autoload反而更像require。