程式扎記: [ Ruby Gossip ] Basic : 基本指令與觀念 - load 與 require

標籤

2014年10月1日 星期三

[ Ruby Gossip ] Basic : 基本指令與觀念 - load 與 require

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

load 與 require
如果要在一個.rb檔案中,使用另一個.rb中撰寫的程式碼,可以使用 load 方法 與require方 法,兩者應用場合略有不同。先來看到load方法的使用。例如,你可以撰寫以下的 utility.rb 檔案:
- utility.rb
  1. puts "load " + __FILE__  
其中 __FILE__ 可 取得程式碼所在的檔名,在相同目錄中,接著撰寫 main.rb:
- main.rb
  1. puts "Begin " + __FILE__  
  2. load "utility.rb"  
  3. puts "Continue " + __FILE__  
  4. load "utility.rb"  
如果執行 main.rb,可以看到以下結果:
Begin main.rb
load ./utility.rb
Continue main.rb
load ./utility.rb

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

require 與 load 類似,不過使用時可不加上 .rb 副檔名。例如:
- main2.rb
  1. puts "Begin " + __FILE__  
  2. require "utility"  
  3. puts "Continue " + __FILE__  
  4. require "utility"  
執行結果:
Begin main2.rb
load ./utility.rb
Continue main2.rb

require 是個方法,你可以使用判斷式依條件決定是否載入某個 .rb 檔。與 load 不同的是,require載入過的檔案,再次 require 並不會重複執行,require 也可以使用相對或絕對路徑方式。

以術語來說,load 要求載入一個檔案,而 require 要求某個功能特性(Feature。在指定相對路徑或不指定路徑 情況下,load 與 require會從預設路徑尋找指定載入的檔案或特性。可以從 $:變數取得這些路徑,必要時可以在啟用 ruby 時加上 -I 指定路徑:
# rb -e "puts $:"
/root/jruby/lib/ruby/site_ruby/1.8
/root/jruby/lib/ruby/site_ruby/shared
/root/jruby/lib/ruby/1.8
.

注意最後一行的點符號,那代表目前路徑。你可以要求 rbconfig 特性,使用其中的 Config::CONFIG 物件,這是一個雜湊(Hash)物件,可以指定名稱作為鍵(Key),取得相對應的值,Config::CONFIG 物件記錄了Ruby安裝時的一些資訊。例如:
- dirinfo.rb
  1. require "rbconfig"  
  2. puts "-- bin dir --"  
  3. puts Config::CONFIG["bindir"]  
  4. puts "-- ruby standard library dir --"  
  5. puts Config::CONFIG["rubylibdir"]  
  6. puts "-- c extensions dir --"  
  7. puts Config::CONFIG["archdir"]  
  8. puts "-- site ruby dir --"  
  9. puts Config::CONFIG["sitedir"]  
  10. puts "-- vendor ruby dir-- "  
  11. puts Config::CONFIG["vendordir"]  
執行結果如下:
# rb dirinfo.rb
-- bin dir --
/root/jruby/bin
-- ruby standard library dir --
/root/JRuby/jruby-1.6.6/lib/ruby/1.8
-- c extensions dir --
/root/JRuby/jruby-1.6.6/lib/ruby/1.8/java
-- site ruby dir --
/root/JRuby/jruby-1.6.6/lib/ruby/site_ruby
-- vendor ruby dir--
nil

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"]'
/root/JRuby/jruby-1.6.6/lib/ruby/1.8/java


沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!