以下是 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 —