ruby $LOAD_PATH及類加載


$LOAD_PATH

$LOAD_PATH 指的是Ruby讀取外部文件的一個環境變量,其實和windows的環境變量是一個概念。Ruby會在這個環境變量的路徑中讀取需要require的文件,如果在環境變量中找不到自己想要的文件,就會報LoadError錯誤。還有$LOAD_PATH$:指的都是同一個環境變量

$LOAD_PATH 變量為一個數組,里面存放了路徑字符串.

打印出來的有三個重要的目錄分類:

  • site_ruby 默認優先級最高,安裝本機相關庫
  • vendor_ruby 操作系統供應商進行定制用的,一般為空
  • 2.3 ruby 標准庫目錄. 比如 date, csv 庫

以下代碼會將當前的目錄加入 $LOAD_PATH:

#將當前目錄放添加$LOAD_PATH最前面
$:.unshift __dir__

#在$LOAD_PATH最后追加當前目錄
$: << __dir__

Ruby Kernel 中的類加載

Ruby 內核提供了 4 個類加載命令,分別是 load, autoload, require, require_relative, 分別對應了不同的使用場景,可謂做到了“小的可以打蚊子,大的可以打飛機”.

加載查找的順序是基於 $LOAD_PATH 數組里面的路徑的順序來找的,找到了就不繼續往下找

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

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

 

require_relative

  • require_relative與require類似,它只會在第一次調用時加載。
  • require_relative是直接取相對路徑。此時與$LOAD_PATH($:)無關,是文件本身路徑的相對地址

 

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

  • filename可以是絕對路徑,也可以是相對路徑。Ruby不會為filename添加擴展名;
  • 函數執行時,如果filename是絕對路徑,則會去查找該文件
  • 通常filename是相對路徑,Ruby會在$:中的目錄中搜索該文件。所以通常需要$:.unshift添加搜索路徑;
  • wrap為true時,被加載文件會在一個匿名模塊中執行,避免污染;
  • load會加載文件並執行,成功會返回true,找不到文件會拋出LoadError。

 

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

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

 

 

主要區分:

●require加載文件時可以不加后綴名,load加載文件時必須加后綴名。

●require一般情況下用於加載庫文件,而load用於加載配置文件。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM