Ruby--加載文件--require和require_relative

require

require(name) → true or false

require加載指定的文件,如果加載成功則返回true,如果已經加載過則返回 false。

如果文件名解析出來不是一個絕對路徑,它將會在 $LOAD_PATH(即 $:) 列出的目錄中被查找。

如果文件名中含有擴展名 “.rb”,那麼它將會作爲一個源文件被加載;
如果擴展名是”.so”,”.o” , 或者 “.dll”,或者在當前平臺上默認共享的擴展名,那麼Ruby把共享庫加載爲一個Ruby擴展。
否則,Ruby試圖給傳入的文件名加上 “.rb”, “.so”等等直到該文件被找到。
如果指定名字的文件沒能夠找到,Ruby會拋出一個 LoadError 異常。

對於Ruby擴展,給定的文件名可能使用任意共享庫擴展名。例如,在Linux上socket擴展名是 “socket.so”, 而 require ‘socket.dll’ 將會加載socket擴展。

被加載文件的絕對路徑會被添加到 $LOADED_FEATURES(即 $”)中。如果一個文件的路徑已經出現在$”中,那麼它不會被再次加載。例如,require ‘a’; require ‘./a’ 不會重複加載 a.rb.

require "my-library.rb"
require "db-driver"
require 'csv'

在被加載的源文件中的任意常量或全局變量,都將在調用程序的全局空間中可用。
但是,局部變量不會傳播到加載環境中。

require_relative

require_relative(string) → true or false

Ruby試圖相對於當前要加載其他庫的文件的路徑來加載以字符串形式給出名字的庫。如果文件路徑無法確定,那麼將會拋出一個 LoadError 異常。如果一個文件被成功加載了那麼返回 true, 否則返回 false。

例如,你定義了兩個類Book和Color,在Book中需要引用Color的相關方法,這兩個文件的路徑如下:
/home/your_name/my_ruby_files/book.rb
/home/your_name/my_ruby_files/color.rb

則在book.rb中可以有如下代碼:

require_relative 'color'

class Book
  # some methods and anything else...
end

參考資料

http://ruby-doc.org/core-2.3.0/Kernel.html#method-i-require

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章