全局變量由$開頭.它們可以在程序的任何位置訪問到.在初始化前,全局變量有一個特殊的值 nil.
這里列出了一些以$打頭並跟單個字符的特殊變量.比如,$$包含了Ruby解釋器的進程id,它是只讀的.這里是主要的系統變量以及它們的含義(細節可在Ruby的參考手冊中查到):
$! 最近一次的錯誤信息
$@ 錯誤產生的位置
$_ gets最近讀的字符串
$. 解釋器最近讀的行數(line number)
$& 最近一次與正則表達式匹配的字符串
$~ 作為子表達式組的最近一次匹配
$n 最近匹配的第n個子表達式(和$~[n]一樣)
$= 是否區別大小寫的標志
$/ 輸入記錄分隔符
$\ 輸出記錄分隔符
$0 Ruby腳本的文件名
$* 命令行參數
$$ 解釋器進程ID
$? 最近一次執行的子進程退出狀態
上面的 $_ 和 $~ 都有作用范圍.它們的名字暗示其為全局的,但它們一般都是這樣用的,關於它們的命名有歷史上的原因.
#獲取當前的文件名稱
puts __FILE__
#獲取當前文件的目錄名稱
puts File.dirname(__FILE__)
#獲取當前文件的完整名稱
#當要獲取完整的路徑時需要require 'pathname',代碼如下:
require 'pathname'
puts Pathname.new(__FILE__).realpath
#獲取當前文件的完整目錄
require 'pathname'
puts Pathname.new(File.dirname(__FILE__)).realpath
在ruby程序中,經常會看到一些以$開頭的變量,這些不是指我們自己在程序中設置的全局變量,而是指系統內部已經設置好的變量,他們代表了一些特定的意思,下面搜集了一些常用的內部變量,用一些簡單的代碼說明他們代表的意思:
局部域:
在某一個線程作用域內才能有效,下列也可看做是線程內的局部變量.
PS:這邊講解的幾個變量都是於正則匹配相關的,正則匹配過程的代碼是一樣的,這里不重復輸入正則表達式匹配的代碼,只在第一個例子里給出完整的輸入和輸出,之后的例子只直接輸出變量的值
$_
gets或readline最后讀入的字符串.若遇到EOF則為nil.該變量的作用域是局部域.
Ruby代碼
irb(main):006:0> $_
=> nil
irb(main):007:0> gets
foobar
=> "foobar\n"
irb(main):008:0> $_
=> "foobar\n"
$&
在當前作用域中,正則表達式最后一次匹配成功的字符串.若最后一次匹配失敗,則為nil.
Ruby代碼
irb(main):002:0> $&
=> nil
irb(main):010:0> /(foo)(bar)(BAZ)?/ =~ "foobarbaz"
=> 0
irb(main):011:0> $&
=> "foobar"
$~
在當前作用域中,最后一次匹配成功的相關信息(MatchData對象-為處理與正則表達式的匹配過程相關的信息而設置的類.).
可以使用$~[n]的形式從該數據中抽取第n個匹配結果($n).相當於是$1,$2...
等同於Regexp.last_match.
Ruby代碼
irb(main):012:0> $~
=> #<MatchData "foobar" 1:"foo" 2:"bar" 3:nil>
irb(main):026:0> $1
=> "foo"
irb(main):027:0> $~[1]
=> "foo"
$`
在當前作用域中,正則表達式最后一次匹配成功的字符串前面的字符串.若最后的匹配失敗則為nil.
等同於Regexp.last_match.pre_match.
Ruby代碼
irb(main):016:0> $`
=> "" #由於最后匹配成功的內容是foobar,輸入的字符串前面沒有別的字符所以是""
$'
在當前作用域中,正則表達式最后一次匹配成功的字符串后面的字符串.若最后的匹配失敗則為nil.
等同於Regexp.last_match.post_match.
Ruby代碼
irb(main):028:0> $'
=> "baz"
$+
在當前作用域中,正則表達式最后一次匹配成功的字符串部分中,與最后一個括號相對應的那部分字符串.若最后的匹配失敗則為nil.在多項選擇型匹配模型中,若您無法斷定是哪個部分匹配成功時,該變量將會非常有用.
Ruby代碼
irb(main):029:0> $+
=> "bar"
$1
$2
$3 ...
分別存儲着最后一次模型匹配成功時與第n個括號相匹配的值.若沒有相應的括號時,其值為nil.等同於Regexp.last_match[1], Regexp.last_match[2],...
Ruby代碼
irb(main):030:0> $1
=> "foo"
irb(main):031:0> $2
=> "bar"
irb(main):032:0> $3
=> nil
線程局部域
下列變量在一個線程內部時是全局域變量,但在不同的線程之間是彼此獨立的.
$!
最近發生的異常的信息.由raise設定.
Ruby代碼
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。
Ruby代碼
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"。
Ruby代碼
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,此時不會輸出任何字符。
Ruby代碼
irb(main):082:0> print "abc"
abc=> nil
irb(main):083:0> $\="@"
=> "@"
irb(main):084:0> print "abc"
abc@=> nil
$,
默認的切分字符。若Array#join中省略了參數時或在print的各個參數間將會輸出它。
默認值為 nil ,等同於空字符串。
Ruby代碼
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,此時將進行特殊的分割。
Ruby代碼
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。
Ruby代碼
irb(main):094:0> $$
=> 5167
$:
$LOAD_PATH
包含一個數組,其內容是load或require加載文件時用的搜索目錄列表.
Ruby代碼
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", "."]
還有一些全局常量:
1.ENV,包含程序的環境變量,是一個Hash對象
Ruby代碼
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:
HOMEPATH=>\Documents and Settings\xp2008
include=>C:\Program Files\Microsoft Visual Studio\VC98\atl\include;C:\Program F
les\Microsoft Visual Studio\VC98\mfc\include;C:\Program Files\Microsoft Visual
tudio\VC98\include
INPUTRC=>c:\ruby\bin\inputrc.euro
JAVA_HOME=>C:\Program Files\Java\jdk1.7.0\
LANG=>zh_CN
lib=>C:\Program Files\Microsoft Visual Studio\VC98\mfc\lib;C:\Program Files\Mic
osoft Visual Studio\VC98\lib
LOGONSERVER=>\\HOOOPO
MSDevDir=>C:\Program Files\Microsoft Visual Studio\Common\MSDev98
NUMBER_OF_PROCESSORS=>1
OS=>Windows_NT
Path=>C:\Program Files\PC Connectivity Solution\;C:\Perl\site\bin;C:\Perl\bin;C
\ruby\bin;C:\Tcl\bin;c:\program files\imagemagick-6.4.1-q8;C:\WINDOWS\system32;
:\WINDOWS;C:\WINDOWS\system32\WBEM;C:\Program Files\Ringz Studio\Storm Codec\QT
ystem\;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;c:\Program Files\Mic
osoft SQL Server\90\Tools\binn\;C:\Program Files\Java\jdk1.7.0\;C:\Program File
\e\cmd;C:\Program Files\Git\cmd;C:\Program Files\Git\bin;C:\Program Files\Java\
dk1.7.0\;C:\Program Files\Microsoft Visual Studio\Common\Tools\WinNT;C:\Program
Files\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program Files\Microsoft Vis
al Studio\Common\Tools;C:\Program Files\Microsoft Visual Studio\VC98\bin;C:\Sho
s\0.r1134\..;c:\python25\;C:\Shoes3\0.r1243\..
PATHEXT=>.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.tcl
PROCESSOR_ARCHITECTURE=>x86
PROCESSOR_IDENTIFIER=>x86 Family 15 Model 4 Stepping 9, GenuineIntel
PROCESSOR_LEVEL=>15
PROCESSOR_REVISION=>0409
ProgramFiles=>C:\Program Files
PROMPT=>$P$G
QTJAVA=>C:\Program Files\Ringz Studio\Storm Codec\QTSystem\QTJava.zip
RUBYOPT=>-rubygems
SESSIONNAME=>Console
SST_FASTMEM=>1
SST_SWAP_EN_WAIT_ON_VSYNC=>0
SystemDrive=>C:
SystemRoot=>C:\WINDOWS
TEMP=>C:\DOCUME~1\xp2008\LOCALS~1\Temp
TMP=>C:\DOCUME~1\xp2008\LOCALS~1\Temp
USERDOMAIN=>HOOOPO
USERNAME=>xp2008
USERPROFILE=>C:\Documents and Settings\xp2008
VS80COMNTOOLS=>C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\
windir=>C:\WINDOWS
2.DATA,讀取__END__后程序行的輸入流。如果__END__未出現在代碼中則無定義。
3.STDERR,STDIN,STDOUT
標准輸入、輸出、錯誤流
4.RUBY_PLATFORM,ruby解釋器平台
Ruby代碼
irb(main):008:0> RUBY_PLATFORM
=> "i386-mswin32"
5.ARGF同$* , ARGF同$<
還有很多已經不推薦使用了,不寫了