在ruby程式中,經常會看到一些以$開頭的變數,這些不是指我們自己在程式中設定的全域變數,而是指系統內部已經設定好的變數,他們代表了一些特定的意思,下面搜集了一些常用的內部變數,用一些簡單的代碼說明他們代表的意思:
局部域:
在某一個線程範圍內才能有效,下列也可看做是線程內的局部變數。
PS:這邊講解的幾個變數都是於正則匹配相關的,正則匹配過程的代碼是一樣的,這裡不重複輸入Regex匹配的代碼,只在第一個例子裡給出完整的輸入和輸出,之後的例子只直接輸出變數的值。
$_
gets或readline最後讀入的字串,若遇到EOF則為nil。該變數的範圍是局部域。
irb(main):006:0> $_ => nil irb(main):007:0> gets foobar => "foobar\n" irb(main):008:0> $_ => "foobar\n"
$&
在當前範圍中,Regex最後一次匹配成功的字串,若最後一次匹配失敗,則為nil。
irb(main):002:0> $& => nil irb(main):010:0> /(foo)(bar)(BAZ)?/ =~ "foobarbaz" => 0 irb(main):011:0> $& => "foobar"
$~
在當前範圍中,最後一次匹配成功的相關資訊(MatchData對象——為處理與Regex的匹配過程相關的資訊而設定的類)。可以使用$~[n]的形式從該資料中抽取第n個匹配結果($n),相當於是$1、$2……等同於Regexp.last_match。
irb(main):012:0> $~ => # irb(main):026:0> $1 => "foo" irb(main):027:0> $~[1] => "foo"
$`
在當前範圍中,Regex最後一次匹配成功的字串前面的字串。若最後的匹配失敗則為nil,等同於Regexp.last_match.pre_match。
irb(main):016:0> $` => "" #由於最後匹配成功的內容是foobar,輸入的字串前面沒有別的字元所以是""
$'
在當前範圍中,Regex最後一次匹配成功的字串後面的字串。若最後的匹配失敗則為nil,等同於Regexp.last_match.post_match。
irb(main):028:0> $' => "baz"
$+
在當前範圍中,Regex最後一次匹配成功的字串部分中,與最後一個括弧相對應的那部分字串。若最後的匹配失敗則為nil。在多項選擇型匹配模型中,若您無法斷定是哪個部分匹配成功時,該變數將會非常有用。
irb(main):029:0> $+ => "bar"
$1
$2
$3 ...
在當前範圍中,Regex最後一次匹配成功的字串部分中,與最後一個括弧相對應的那部分字串,若最後的匹配失敗則為nil。在多項選擇型匹配模型中,若您無法斷定是哪個部分匹配成功時,該變數將會非常有用。
irb(main):029:0> $+ => "bar"
線程局部域
下列變數在一個線程內部時是全域域變數,但在不同的線程之間是彼此獨立的。
$!
最近發生的異常的資訊,由raise設定。
def exception begin raise "exception test." ensure puts $! end end exception
輸出結果:
simple.rb:58:in `exception': exception test. (RuntimeError) from simple.rb:64 exception test. # $!中的值
$@
以數組形式儲存著發生異常時的back trace資訊. 數組元素是字串,它顯示了方法調用的位置,其形式為 filename:line或 filename:line:in 'methodname'。在向$@賦值時,$!不能為nil。
def exception begin raise "exception test." ensure puts $@ puts "$@ size is:#{$@.size}" end end exception
輸出結果:
simple.rb:58:in `exception': exception test. (RuntimeError) from simple.rb:65 simple.rb:58:in `exception' #$@中的值,是一個數組,第一個元素是錯誤發生的行數,第二個是異常的內容。下面列印了數組的長度 simple.rb:65 $@ size:2
全域域
這種類型的變數是整個應用中都可以訪問的,而且是同一個變數的引用。
$/
輸入記錄分隔字元。預設值為"\n"。
irb(main):076:0> $/ #初始的輸入分割符 => "\n" irb(main):077:0> gets => "\n" irb(main):078:0> "test" #輸入斷行符號之後,預設插入"\n",輸入結束 => "test" irb(main):079:0> $/="@" #修改輸入符為"@" => "@" irb(main):080:0> gets #輸入斷行符號之後沒有結束讀取進程,直到輸入"@"之後結束 test @ => "test\n@"
$\
輸出記錄分隔字元。print會在最後輸出該字串。預設值為nil,此時不會輸出任何字元。
irb(main):082:0> print "abc" abc=> nil irb(main):083:0> $\="@" => "@" irb(main):084:0> print "abc" abc@=> nil
$,
預設的切分字元。若Array#join中省略了參數時或在print的各個參數間將會輸出它。預設值為 nil ,等同於Null 字元串。
irb(main):087:0> ["a","b","c"].join => "abc" irb(main):088:0> $,="," #修改切分字元為"," => "," irb(main):089:0> ["a","b","c"].join #輸出結果改變 => "a,b,c" irb(main):090:0>
$;
當String#split中省略參數時的切分字元。預設值為nil,此時將進行特殊的分割。
irb(main):090:0> $; => nil irb(main):091:0> "abc".split #預設的切分字元情況下,把整個字元當成一個元素 => ["abc"] irb(main):092:0> $;="b" => "b" irb(main):093:0> "abc".split #以"b"為切分字元情況下,把整個字元當成兩個元素 => ["a", "c"]
$*
傳遞給Ruby指令碼的參數.內部常數ARGV的別名。
$$
當前運行中的Ruby進程的pid。
irb(main):094:0> $$ => 5167
$:
$LOAD_PATH
包含一個數組,其內容是load或require負載檔案時用的搜尋目錄列表。
irb(main):095:0> $: => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."] irb(main):096:0> $LOAD_PATH => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", "."]
全域常量ENV
包含程式的環境變數,是一個Hash對象。
irb(main):006:0> ENV.each{|k,v| puts "#{k}=>#{v}"} ALLUSERSPROFILE=>C:\Documents and Settings\All Users APPDATA=>C:\Documents and Settings\xp2008\Application Data CLASSPATH=>.;C:\Program Files\Ringz Studio\Storm Codec\QTSystem\QTJava.zip CLIENTNAME=>Console CommonProgramFiles=>C:\Program Files\Common Files COMPUTERNAME=>HOOOPO ComSpec=>C:\WINDOWS\system32\cmd.exe FP_NO_HOST_CHECK=>NO HOME=>C:\Documents and Settings\xp2008 HOMEDRIVE=>C: #==============下略============#==============下略============
DATA
讀取__END__後程式行的輸入資料流。如果__END__未出現在代碼中則無定義。
STDERR,STDIN,STDOUT
標準輸入、輸出、錯誤流
RUBY_PLATFORM
ruby解譯器平台
irb(main):008:0> RUBY_PLATFORM => "i386-mswin32"
ARGF同$* , ARGF同$