Ruby常用的内部变量
在ruby程序中,经常会看到一些以$开头的变量,这些不是指我们自己在程序中设置的全局变量,而是指系统内部已经设置好的变量,他们代表了一些特定的意思,下面搜集了一些常用的内部变量,用一些简单的代码说明他们代表的意思:
局部域:
在某一个线程作用域内才能有效,下列也可看做是线程内的局部变量。
PS:这边讲解的几个变量都是于正则匹配相关的,正则匹配过程的代码是一样的,这里不重复输入正则表达式匹配的代码,只在第一个例子里给出完整的输入和输出,之后的例子只直接输出变量的值。
$_
gets或readline最后读入的字符串,若遇到EOF则为nil。该变量的作用域是局部域。
irb(main): 006 : 0 > $_ => nil irb(main): 007 : 0 > gets foobar => "foobar\n" irb(main): 008 : 0 > $_ => "foobar\n" |
$&
在当前作用域中,正则表达式最后一次匹配成功的字符串,若最后一次匹配失败,则为nil。
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。
irb(main): 012 : 0 > $~ => #<matchdata "foobar"="" 1:"foo"="" 2:"bar"="" 3:nil=""> irb(main): 026 : 0 > $1 => "foo" irb(main): 027 : 0 > $~[ 1 ] => "foo" </matchdata> |
$`
在当前作用域中,正则表达式最后一次匹配成功的字符串前面的字符串。若最后的匹配失败则为nil,等同于Regexp.last_match.pre_match。
irb(main): 016 : 0 > $` => "" #由于最后匹配成功的内容是foobar,输入的字符串前面没有别的字符所以是"" |
$'
在当前作用域中,正则表达式最后一次匹配成功的字符串后面的字符串。若最后的匹配失败则为nil,等同于Regexp.last_match.post_match。
irb(main): 028 : 0 > $' => "baz" |
$+
在当前作用域中,正则表达式最后一次匹配成功的字符串部分中,与最后一个括号相对应的那部分字符串。若最后的匹配失败则为nil。在多项选择型匹配模型中,若您无法断定是哪个部分匹配成功时,该变量将会非常有用。
irb(main): 029 : 0 > $+ => "bar" |
$1
$2
$3 ...
在当前作用域中,正则表达式最后一次匹配成功的字符串部分中,与最后一个括号相对应的那部分字符串,若最后的匹配失败则为nil。在多项选择型匹配模型中,若您无法断定是哪个部分匹配成功时,该变量将会非常有用。
irb(main): 029 : 0 > $+ => "bar" |
线程局部域
下列变量在一个线程内部时是全局域变量,但在不同的线程之间是彼此独立的。
$!
最近发生的异常的信息,由raise设定。
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。
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"。
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,此时不会输出任何字符。
irb(main): 082 : 0 > print "abc" abc=> nil irb(main): 083 : 0 > $\= "@" => "@" irb(main): 084 : 0 > print "abc" abc@=> nil |
$,
默认的切分字符。若Array#join中省略了参数时或在print的各个参数间将会输出它。默认值为 nil ,等同于空字符串。
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,此时将进行特殊的分割。
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。
irb(main): 094 : 0 > $$ => 5167 |
$:
$LOAD_PATH
包含一个数组,其内容是load或require加载文件时用的搜索目录列表。
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" , "." ] |
全局常量
ENV
包含程序的环境变量,是一个Hash对象。
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 : #==============下略============ #==============下略============ |
DATA
读取__END__后程序行的输入流。如果__END__未出现在代码中则无定义。
STDERR,STDIN,STDOUT
标准输入、输出、错误流
RUBY_PLATFORM
ruby解释器平台
irb(main): 008 : 0 > RUBY_PLATFORM => "i386-mswin32" |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义