load 與 require


你 可以在.rb檔案中撰寫Ruby程式碼,實際程式開發不會只在一個.rb中撰寫應用程式所有程式碼,而會依功能,在不同的.rb中撰寫程式。

如果要在一個.rb檔案中,使用另一個.rb中撰寫的程式碼,可以使用load方 法與require方 法,兩者應用場合略有不同。先來看到load方法的使用。例如,你可以撰寫以下的utility.rb檔案:
  • utility.rb
puts "load " + __FILE__

其中__FILE__可 取得程式碼所在的檔名,在相同目錄中,接著撰寫main.rb
  • main.rb
puts "Begin " + __FILE__
load "utility.rb"
puts "Continue " + __FILE__
load "utility.rb"

如果執行main.rb,可以看到以下結果:
puts "Begin main.rb"
load "utility.rb"
puts "Continue main.rb"
load "utility.rb"

可以看到,每執行一次load方 法,被載入的.rb檔就會執行一次。load方 法也可以使用相對路徑或絕對路徑,指定要載入的.rb檔案。例如:
load "../utility.rb"
load "C:/workspace/utility.rb"

load是 個方法,這代表你可以將它放在判斷式中,依條件決定是否載入某個.rb檔案,由於load每 載入.rb檔案一次,就會重新執行.rb檔案的內容,因此.rb檔案的內容若有變動,執行時就會套用變動後的程式碼。

require與 load類似,不過使用時可不加上.rb副檔名。例如:
  • main.rb
puts "Begin " + __FILE__
require "utility"
puts "Continue " + __FILE__
require "utility"

require是 個方法,這代表你可以將它放在判斷式中,依條件決定是否載入某個.rb檔。與 load不同的是,require載入過的檔案,再次require並不會重複執行,require也可以使用相對或絕對路徑方式。例如:
require"../utility"
require "C:/workspace/utility"

以術語來說,load 要求載入一個檔案,而require要求某個功 能特 性(Feature)。在指定相對路徑或不指定路徑 情況下,load與require會從預設路徑尋找指定載入的檔案或特性。可以從$:變 數取得這些路徑,必要時,可以在啟用ruby時加上-I指定路徑:
C:\workspace>ruby -e 'puts $:'
C:/winware/ruby191/lib/ruby/gems/1.9.1/gems/bcrypt-ruby-3.0.1-x86-mingw32/lib
C:/winware/ruby191/lib/ruby/gems/1.9.1/gems/color-1.4.1/lib
C:/winware/ruby191/lib/ruby/gems/1.9.1/gems/fastercsv-1.5.4/lib
C:/winware/ruby191/lib/ruby/gems/1.9.1/gems/json-1.6.1/lib
C:/winware/ruby191/lib/ruby/gems/1.9.1/gems/orm_adapter-0.0.5/lib
C:/winware/ruby191/lib/ruby/gems/1.9.1/gems/rack-1.3.4/bin
C:/winware/ruby191/lib/ruby/gems/1.9.1/gems/rack-1.3.4/lib
C:/winware/ruby191/lib/ruby/gems/1.9.1/gems/rake-0.9.2/bin
C:/winware/ruby191/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib
C:/winware/ruby191/lib/ruby/gems/1.9.1/gems/warden-1.0.6/lib
C:/winware/ruby191/lib/ruby/site_ruby/1.9.1
C:/winware/ruby191/lib/ruby/site_ruby/1.9.1/i386-msvcrt
C:/winware/ruby191/lib/ruby/site_ruby
C:/winware/ruby191/lib/ruby/vendor_ruby/1.9.1
C:/winware/ruby191/lib/ruby/vendor_ruby/1.9.1/i386-msvcrt
C:/winware/ruby191/lib/ruby/vendor_ruby
C:/winware/ruby191/lib/ruby/1.9.1
C:/winware/ruby191/lib/ruby/1.9.1/i386-mingw32
.

注意最後一行的點符號,那代表目前路徑。你可以要求rbconfig特 性,使用其中的Config::CONFIG物 件,這是一個雜湊(Hash)物件,可以指定名稱作為鍵(Key),取得相對應的值,Config::CONFIG物 件記錄了Ruby安裝時的一些資訊。例如:
  • dirinfo.rb
require "rbconfig"
puts "-- bin dir --"
puts Config::CONFIG["bindir"]
puts "-- ruby standard library dir --"
puts Config::CONFIG["rubylibdir"]
puts "-- c extensions dir --"
puts Config::CONFIG["archdir"]
puts "-- site ruby dir --"
puts Config::CONFIG["sitedir"]
puts "-- vendor ruby dir-- "
puts Config::CONFIG["vendordir"]

執行結果如下:
-- bin dir --
C:/winware/ruby191/bin
-- ruby standard library dir --
C:/winware/ruby191/lib/ruby/1.9.1
-- c extensions dir --
C:/winware/ruby191/lib/ruby/1.9.1/i386-mingw32
-- site ruby dir --
C:/winware/ruby191/lib/ruby/site_ruby
-- vendor ruby dir--
C:/winware/ruby191/lib/ruby/vendor_ruby

Config::CONFIG["bindir"]可 取得Ruby安裝中bin資 料夾目錄。Config::CONFIG["rubylibdir"]可 取得Ruby撰寫的標 準程式庫(Library) 目錄。Config::CONFIG["archdir"]可取得C 撰寫的擴充(Extensions), 這些擴充可以使用require在程式中要求取得功能特性。以術語來 說,如果說你寫了一個擴充,通常是指它用C撰寫,如果說你寫了一個程式庫,通常是指它用Ruby撰寫Config::CONFIG["sitedir"]通 常放置可信任第三方程式庫的目錄,Config::CONFIG["vendordir"]則是放 置廠商程式庫。

先前還可以看到gems等目錄,RubyGem 是包裝、散佈Ruby程式庫的標準方式,如果使用gem工具程 式安裝的程式庫,就會放在gems等目錄中,可參考 RubyGems Guides 的說明。

在啟動ruby程式時,也可以使用-r指定要求的特性。例如:
>ruby -rrbconfig -e 'puts Config::CONFIG["archdir"]'
C:/winware/ruby191/lib/ruby/1.9.1/i386-mingw32

>