Ruby中的require、load、autoload

來源:互聯網
上載者:User

標籤: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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.