?
This document uses PHP Chinese website manual Release
本參考手冊使用下列術語.
所有以`$'開頭的變量
全局變量中的內部變量(本網頁介紹的變量)
內部變量中,形如"`$' + 1位數字或符號"的變量
內部變量中,由命令行選項設定的變量,形如"`$-' +1個選項字符"
有時,內部變量(有特殊的功能和用途)的有效作用域不只限于全局,盡管如此,上述定義還是把它們劃入到全局變量的范疇中(可以在任何地方使用內部變量,從這種意義上說它們是全局的,但它們的值并不只限于全局).
根據變量值的作用域的不同,大致將內部變量劃分如下.
下列也可看做是線程內的局部變量.
$_
gets
或readline
最后讀入的字符串.若遇到EOF則為nil.該變量的作用域是局部域.(記憶方法:與 Perl相同)
$&
在當前作用域中,正則表達式最后一次匹配成功的字符串.若最后一次匹配失敗,則為nil.(記憶方法: 它和某些編輯器中的&
是相同的)
等同于Regexp.last_match[0].
$~
在當前作用域中,最后一次匹配成功的相關信息(MatchData對象).若對其進行設定的話, 則$&
以及$1 ... $9
等的值也會發(fā)生變化.
可以使用$~[n]
的形式從該數據中抽取第n個匹配結果($n).(記憶方法: ~ 是用來進行匹配的)
等同于Regexp.last_match.
$`
在當前作用域中,正則表達式最后一次匹配成功的字符串前面的字符串.若最后的匹配失敗則為nil.(記憶方法: `
被放在字符串前面)
等同于Regexp.last_match.pre_match.
$'
在當前作用域中,正則表達式最后一次匹配成功的字符串后面的字符串.若最后的匹配失敗則為nil.(記憶方法: '
被放在字符串后面)
等同于Regexp.last_match.post_match.
$+
在當前作用域中,正則表達式最后一次匹配成功的字符串部分中,與最后一個括號相對應的那部分字符串.若最后的匹配失敗則為nil.在多項選擇型匹配模型中,若您無法斷定是哪個部分匹配成功時,該變量將會非常有用.(記憶方法: be positive and forward looking.)
$1
$2
$3 ...
分別存儲著最后一次模型匹配成功時與第n個括號相匹配的值.若沒有相應的括號時,其值為nil.(記憶方法: 類似于 \數字)
等同于Regexp.last_match[1], Regexp.last_match[2],...
下列變量在一個線程內部時是全局域變量,但在不同的線程之間是彼此獨立的.
$?
本線程中最后結束的子進程的狀態(tài)值. 1.6版本以前是整數,從1.7版本開始變?yōu)?font color="blue">Process::Status對象.另外,請參考Process#wait等.
整數值就是使用wait()系統調用所獲得的值,要想得到子進程的exit status的話,還得除以256($?/256). 1.7版本以后還可以使用Process::Status#exitstatus.
$!
最近發(fā)生的異常的信息.由raise設定.
$@
以數組形式保存著發(fā)生異常時的back trace信息. 數組元素是字符串,它顯示了方法調用的位置,其形式為
"filename:line"
或
"filename:line:in `methodname'"
這和caller的返回值形式一致。
在向$@
賦值時,$!不能為nil。調用$@的方法與$!.backtrace相同。而賦值方法與$!.set_backtrace相同。
(記憶方法:where exception occurred at.)
$SAFE
當前線程的安全等級。關于安全等級,請參考安全模型。
與Thread.current.safe_level相同。
$=
obsolete: 該變量將被廢止。
說明在模式匹配或字符串比較中是否要區(qū)分大小寫字母的標識。默認值為nil。
$/
輸入記錄分隔符。默認值為"\n"
。其運作類似于awk
的RS變量。
若將該變量設為 nil 時,將一次讀入整個文件。若設為空字符串 "" 則將是段落模式,此時會把2個以上的連續(xù)的換行符當作記錄切分符。
不能在$/
中使用正則表達式。
(記憶方法: 在詩歌中使用 / 作為行的切分)
$\
輸出記錄分隔符。print會在最后輸出該字符串。
默認值為nil
,此時不會輸出任何字符。
$,
默認的切分字符。若Array#join中省略了參數時或在print的各個參數間將會輸出它。
默認值為 nil ,等同于空字符串。
$;
當String#split中省略參數時的切分字符。默認值為nil,此時將進行特殊的分割。詳情請參考String#split。
ruby 1.8 feature:在1.6版本中只能把字符串賦值給$;。在1.8版本中則可以將任何對象代入其中,但考慮到String#split的變更問題,還是應該使用正則表達式。
同時,為了提供兼容性,最好不要依賴于 $; 。
$.
最后讀入的輸入文件的行號。
與ARGF.lineno相同。若需要取得每個參數文件的行號時,需要使用ARGF.file.lineno。
$<
由參數(若沒的話就使用標準輸入)構成的虛擬文件。也就是常數ARGF的別名。(記憶方法: <
指定了shell的輸入源)
$deferr ((<ruby 1.8 特性>)) ((<obsolete>))
Ruby解釋器輸出錯誤信息、警告信息和warn時的輸出對象。
只能將內部帶有write方法的對象賦值給該變量。(warn 等內部方法最終將調用$deferr.write方法)。
$deferr 是 $stderr 的別名。$deferr (盡管它剛出現不久) 將被廢止。
$>
$defout ((<obsolete>))
內部函數print、puts或p等的默認輸出對象。初始值為STDOUT。若指定了-i[extension]選項的話,則將使用與讀取源同名的文件。(記憶方法: >
指定了shell的輸出對象)
只能將內部帶有write方法的對象賦值給該變量(print等內部方法最終將調用write方法)。
若想改變print等Ruby內部函數的輸出對象時,可以將該變量的值設定為別的IO即可。若想要改變子進程或C語言擴展庫的標準輸出時,則必須使用IO#reopen將標準輸出重定向(redirect)到別的IO。請參考$stdout。
ruby 1.8 特性:
$defout 是 $stdout 的別名。$defout 是obsolete。
$0
$PROGRAM_NAME ((<ruby 1.8 特性>))
當前運行中的Ruby腳本名.根據OS的不同,有時向該變量賦值后,ps(1)的輸出會發(fā)生變化.該功能適合于用來表示當前程序的狀態(tài).(記憶方法: 與sh 或 ksh 相同)
$*
傳遞給Ruby腳本的參數.內部常數ARGV的別名.Ruby自身用的參數已經被摘除.(記憶方法: 與sh 或 ksh 相同)
$$
當前運行中的Ruby進程的pid。(記憶方法: 與shell相同)
與Process.pid相同.
$:
$LOAD_PATH
包含一個數組,其內容是load或require加載文件時用的搜索目錄列表.(記憶方法: 冒號是環(huán)境變量PATH的切分符)
包含下列內容:啟動時-I directory 選項所指定的目錄,環(huán)境變量RUBYLIB的值,編譯時指定的默認值還有"."(當前目錄).下列就是典型的UNIX系統上的加載路徑.
-I 指定的路徑 環(huán)境變量 RUBYLIB 的值 /usr/local/lib/ruby/site_ruby/VERSION site固有的,取決于VERSION的庫 /usr/local/lib/ruby/site_ruby/VERSION/ARCH site固有的,取決于系統的擴展庫 /usr/local/lib/ruby/site_ruby site固有的庫 /usr/local/lib/ruby/VERSION 標準庫 /usr/local/lib/ruby/VERSION/ARCH 標準的,取決于系統的擴展庫 . 當前目錄
上表中的VERSION是表示Ruby版本的字符串,如"1.6"或"1.8"等.ARCH是表示硬件和OS的字符串,如"i686-linux"或"alpha-osf5.1"等.可以從Config::CONFIG['arch']中得到這些信息.
在多數UNIX系統中,編譯時的默認路徑是"/usr/local/lib/ruby".在mswin32,mingw32,cygwin,bccwin32,mswince這些環(huán)境中,是以ruby.dll所在位置為起點的相對路徑.而在djgpp,emx(OS/2)中,則是以ruby.exe所在位置為起點的相對路徑.
在使用-T 選項啟動時,若將$SAFE設為1以上的值的話,則"." (當前目錄)不會被納入加載路徑.
如require 'foo'
時,將交互搜索.rb和.so.
/usr/local/lib/ruby/site_ruby/VERSION/foo.rb /usr/local/lib/ruby/site_ruby/VERSION/foo.so /usr/local/lib/ruby/site_ruby/VERSION/ARCH/foo.rb /usr/local/lib/ruby/site_ruby/VERSION/ARCH/foo.so : :
有的系統的共享庫擴展名并非.so,此時將自動使用新的擴展名.例如在HP-UX上require 'foo.so'時將搜索foo.sl.因此在Ruby內部,可以一直使用.so.
若想用命令行查看加載路徑的話,可以這樣
$ ruby -e 'puts $:'
即可.
$"
$LOADED_FEATURES ((<ruby 1.8 特性>))
包含以require加載的文件名的數組.這可以防止require多次加載同一個文件.
$DEBUG
若此值為真則變成調試模式。它由-d選項進行設定。
調試模式與普通的運行有以下不同。
若某線程因發(fā)生異常而結束時,整個解釋器也將中止工作。這等同于將Thread.abort_on_exception設置為true的效果,但是在調試模式中,即使在腳本中使用 abort_on_exception= 類方法來重置標識也無法取消該效果。
在通常的運行中,若某線程發(fā)生了異常卻并沒有被Thread#join等檢測到的話,該線程將被無警告地終止。
$FILENAME
虛擬文件ARGF中,當前正在讀入的(gets方法正在讀的)文件名。與ARGF.filename相同。
$LOAD_PATH
$:的別名。
$stdin
$stdout
$stderr
標準輸入,標準輸出,標準錯誤輸出。
ruby 1.8 特性
$stdout, $stderr 是 $defout,$deferr 的別名。($defout, $deferr 已經廢止)
$stdout, $stderr的對應對象中必須要有名為write的方法。詳細情況請參考defout,deferr。
$stdin同$stdout、$stderr一樣,即使沒有特定的方法也可以對其賦值。若執(zhí)行gets等方法時,該方法將被投射到$stdin對應的對象中。(將執(zhí)行$stdin.gets)
$stdin所對應的對象中應該定義下列方法。(請根據需要取舍)
gets, readline, readlines, getc, readchar, tell, seek, pos=, rewind, fileno, to_io, eof, each_line, each_byte, binmode, closed?
例:
$stdin = Object.new def $stdin.gets "foo" end p gets # => "foo"
若想對標準輸入、輸出、錯誤輸出等進行重定向(redirect)時,可以使用IO#reopen(1.6版也是如此)。例如
$stdout = File.open("/tmp/foo", "w")
寫成這樣
STDOUT.reopen("/tmp/foo", "w")
就可以了。若想取消重定向時
stdout_sv = STDOUT.dup # 保存 STDOUT STDOUT.reopen("/tmp/foo") # 將 STDOUT 重定向到 /tmp/foo puts "foo" # 輸出到 /tmp/foo STDOUT.flush # 必須(?) STDOUT.reopen(stdout_sv) # 恢復原狀
就可以了。若您不想讓重定向影響到子進程的話,只要向$stdout等賦值就足夠了。
# 改變輸出方法的默認輸出對象 $stdout = File.open("/tmp/foo", "w") puts "foo" # 取回輸出方法的默認輸出對象。 $stdout = STDOUT
ruby 1.6 特性: 向$stdin、$stdout、$stderr賦值時,會進行重定向。
ruby 1.7 特性: 暫時修改了重定向的運作方式[ruby-dev:14601]。
$VERBOSE
冗長消息標識。由面向Ruby解釋器的-v選項進行設定。
ruby 1.8 特性
警告等級分為三級,分別如下。
可以使用命令行選項-W[level]來指定警告等級,分別為-W0、-W1、-W2 (or -W)。指定-v或-w時,等同于-W2。
若設定為nil、false之外的值時,其值為變?yōu)閠rue。
$KCODE
Ruby可識別的多字節(jié)字符串的編碼。變量值為"EUC" "SJIS" "UTF8" "NONE"之一。
當$KCODE的值為"EUC"時,將假定字符串或正則表達式的編碼為EUC-JP。同樣地,若為"SJIS"時則認定為Shift JIS。若為"UTF8"時則認定為UTF-8。若為"NONE"時,將不會識別多字節(jié)字符串。
在向該變量賦值時,只有第1個字節(jié)起作用,且不區(qū)分大小寫字母。"e" "E" 代表 "EUC","s" "S" 代表 "SJIS","u" "U" 代表 "UTF8",而"n" "N" 則代表 "NONE"。
默認值為"NONE"。
[參考]
目前$KCODE
將對Ruby的下列動作產生影響。
用來顯示Ruby解釋器命令行信息的變量。其形式為$-?
,?的部分是1位選項字符。
$-0
$/ 的別名。
$-a
若指定了-a時,其值為真。只讀變量。
$-d
$DEBUG 的別名。
$-F
$; 的別名。
$-i
若指定了-i[extension]時,它將保存擴展名字符串。否則其值為nil。也可以在腳本中對其進行賦值,此時將在開始讀入ARGV中的下一個文件之前進行in-place替換。
$-I
$LOAD_PATH 的別名。
$-K
$KCODE 的別名。
$-l
若指定了-l時,其值為真。只讀變量。
$-p
若指定了-p時,其值為真。只讀變量。
$-v
$-w
$VERBOSE 的別名。
$-W ((<ruby 1.9 特性>))
返回由-W[level]指定的值。
也就是說,根據$VERBOSE的取值不同
而返回上述諸值之一。只讀變量。