以下是 Ruby 中常見的 內置全局變量 及其用途的詳細說明。這些變量以 $
開頭,由 Ruby 解釋器自動管理,用于訪問系統狀態、異常、輸入輸出等核心信息。
一、異常處理相關
全局變量 | 說明 | 示例 |
---|---|---|
$! | 當前作用域最后拋出的異常對象(等同于 rescue => e 中的 e )。 | ruby<br>begin<br> 1/0<br>rescue<br> puts $!.message # => "divided by 0"<br>end |
$@ | 最后拋出異常的堆棧跟蹤信息(等同 $!.backtrace )。 | ruby<br>puts $@ # => ["(irb):2:in `/'", "(irb):2:in `<main>'"] |
$ERROR_INFO | $! 的別名(需 require 'English' 后可用)。 |
二、輸入輸出相關
全局變量 | 說明 | 示例 |
---|---|---|
$_ | 最后通過 gets 或 readline 讀取的輸入行(隱式接收輸入內容)。 | ruby<br>while gets<br> puts $_ # 輸出當前行<br>end |
$. | 當前輸入流的行號(最后一次讀取的行數)。 | ```ruby File.open(“test.txt”) do |
$< | 當前輸入流(默認是 ARGF ,處理多文件輸入時使用)。 | ruby<br>$<.each_line { |line| puts line } |
$> | 默認輸出流(默認是 $stdout ,可重定向)。 | ruby<br>$> = File.open("output.log", "w")<br>puts "日志內容" |
三、進程控制相關
全局變量 | 說明 | 示例 |
---|---|---|
$? | 最后執行的子進程狀態(Process::Status 對象)。 | ruby<br>`ls`<br>puts $?.success? # => true |
$$ | 當前 Ruby 進程的 PID(進程 ID)。 | ruby<br>puts $$ # => 12345 |
$0 | 當前執行的腳本文件名(等同于 __FILE__ )。 | ruby<br>puts $0 # => "script.rb" |
四、字符串匹配相關
全局變量 | 說明 | 示例 |
---|---|---|
$~ | 最后一次正則表達式匹配的 MatchData 對象(等同 Regexp.last_match )。 | ruby<br>"hello" =~ /e/<br>puts $~[0] # => "e" |
$& | 最后一次匹配的完整文本(等同 $~[0] )。 | ruby<br>"abc" =~ /b/<br>puts $& # => "b" |
$1, $2... | 最后一次正則匹配的分組捕獲結果($1 對應第一個分組)。 | ruby<br>"2023-10-01" =~ /(\d{4})-(\d{2})-(\d{2})/<br>puts $1 # => "2023" |
五、其他實用全局變量
全局變量 | 說明 | 示例 |
---|---|---|
$: | Ruby 的加載路徑(等同于 $LOAD_PATH )。 | ruby<br>$: << "/custom/path" |
$DEBUG | 表示是否在調試模式(由 -d 或 --debug 參數啟用)。 | ruby<br>puts $DEBUG # => false |
$FILENAME | 當前 ARGF 處理的文件名(需 require 'English' 后可用)。 | |
$PROGRAM_NAME | 當前程序名稱(等同 $0 )。 |
六、注意事項
-
可讀性差
全局變量如$1
、$&
等缺乏語義,建議優先使用MatchData
對象:if (match = text.match(/pattern/))puts match[1] end
-
線程安全問題
全局變量在多線程環境中可能引發競態條件,需謹慎使用。 -
部分變量已棄用
如$=
(忽略大小寫標志)在 Ruby 1.9+ 中已移除。
七、完整列表(部分)
Ruby 還包含更多內置全局變量,可通過 global_variables
方法查看:
puts global_variables
# => [:$;, $:, $., $<, $>, $0, $DEBUG, ...]
總結
雖然內置全局變量提供了便捷的系統訪問能力,但在實際開發中應 優先使用更明確的替代方案(如顯式異常對象、__FILE__
常量等),以提升代碼可讀性和可維護性。
— END —