ruby内置全局变量

发布于:2025-04-13 ⋅ 阅读:(23) ⋅ 点赞:(0)

以下是 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' 后可用)。

二、输入输出相关

全局变量 说明 示例
$_ 最后通过 getsreadline 读取的输入行(隐式接收输入内容)。 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. 可读性差
    全局变量如 $1$& 等缺乏语义,建议优先使用 MatchData 对象:

    if (match = text.match(/pattern/))
      puts match[1]
    end
    
  2. 线程安全问题
    全局变量在多线程环境中可能引发竞态条件,需谨慎使用。

  3. 部分变量已弃用
    $=(忽略大小写标志)在 Ruby 1.9+ 中已移除。


七、完整列表(部分)

Ruby 还包含更多内置全局变量,可通过 global_variables 方法查看:

puts global_variables
# => [:$;, $:, $., $<, $>, $0, $DEBUG, ...]

总结

虽然内置全局变量提供了便捷的系统访问能力,但在实际开发中应 优先使用更明确的替代方案(如显式异常对象、__FILE__ 常量等),以提升代码可读性和可维护性。

— END —


网站公告

今日签到

点亮在社区的每一天
去签到