想过成功,也想过失败。但从未想过放弃……

ruby 中内部变量大全

上一篇 / 下一篇  2009-11-21 15:45:18 / 个人分类:编程语言

ruby程序中,经常会看到一些以$开头的变量,这些不是指我们自己在程序中设置的全局变量,而是指系统内部已经设置好的变量,他们代表了一些特定的意思,下面搜集了一些常用的内部变量,用一些简单的代码说明他们代表的意思: 

局部域: 
在某一个线程作用域内才能有效,下列也可看做是线程内的局部变量. 
PS:这边讲解的几个变量都是于正则匹配相关的,正则匹配过程的代码是一样的,这里不重复输入正则表达式匹配的代码,只在第一个例子里给出完整的输入和输出,之后的例子只直接输出变量的值 
$_ 
    gets或readline最后读入的字符串.若遇到EOF则为nil.该变量的作用域是局部域. 
Ruby代码 
  1. irb(main):006:0> $_  
  2. => nil  
  3. irb(main):007:0> gets  
  4. foobar  
  5. => "foobar\n"  
  6. irb(main):008:0> $_  
  7. => "foobar\n"  

$& 
    在当前作用域中,正则表达式最后一次匹配成功的字符串.若最后一次匹配失败,则为nil. 
Ruby代码 
  1. irb(main):002:0> $&  
  2. => nil  
  3. irb(main):010:0> /(foo)(bar)(BAZ)?/ =~ "foobarbaz"  
  4. => 0  
  5. irb(main):011:0> $&  
  6. => "foobar"  

$~ 
    在当前作用域中,最后一次匹配成功的相关信息(MatchData对象-为处理与正则表达式的匹配过程相关的信息而设置的类.). 
    可以使用$~[n]的形式从该数据中抽取第n个匹配结果($n).相当于是$1,$2... 
    等同于Regexp.last_match. 
Ruby代码 
  1. irb(main):012:0> $~  
  2. => #<MatchData "foobar" 1:"foo" 2:"bar" 3:nil>  
  3.   
  4. irb(main):026:0> $1  
  5. => "foo"  
  6. irb(main):027:0> $~[1]  
  7. => "foo"  

$` 
    在当前作用域中,正则表达式最后一次匹配成功的字符串前面的字符串.若最后的匹配失败则为nil. 
    等同于Regexp.last_match.pre_match. 
Ruby代码 
  1. irb(main):016:0> $`  
  2. => ""  #由于最后匹配成功的内容是foobar,输入的字符串前面没有别的字符所以是""  

$' 
    在当前作用域中,正则表达式最后一次匹配成功的字符串后面的字符串.若最后的匹配失败则为nil. 
    等同于Regexp.last_match.post_match. 
Ruby代码 
  1. irb(main):028:0> $'  
  2. => "baz"  

$+ 
    在当前作用域中,正则表达式最后一次匹配成功的字符串部分中,与最后一个括号相对应的那部分字符串.若最后的匹配失败则为nil.在多项选择型匹配模型中,若您无法断定是哪个部分匹配成功时,该变量将会非常有用. 
Ruby代码 
  1. irb(main):029:0> $+  
  2. => "bar"  

$1 
$2 
$3 ...
 
    分别存储着最后一次模型匹配成功时与第n个括号相匹配的值.若没有相应的括号时,其值为nil.等同于Regexp.last_match[1], Regexp.last_match[2],... 
Ruby代码 
  1. irb(main):030:0> $1  
  2. => "foo"  
  3. irb(main):031:0> $2  
  4. => "bar"  
  5. irb(main):032:0> $3  
  6. => nil  


线程局部域 
下列变量在一个线程内部时是全局域变量,但在不同的线程之间是彼此独立的. 

$! 
    最近发生的异常的信息.由raise设定. 
Ruby代码 
  1. def exception  
  2.     begin  
  3.         raise "exception test."  
  4.     ensure  
  5.         puts $!  
  6.     end  
  7. end  
  8.   
  9. exception  

结果: 
引用

simple.rb:58:in `exception': exception test. (RuntimeError) 
from simple.rb:64 
exception test. # $!中的值 


$@ 
    以数组形式保存着发生异常时的back trace信息. 数组元素是字符串,它显示了方法调用的位置,其形式为 
    "filename:line" 
    或 
    "filename:line:in `methodname'" 
    在向$@赋值时,$!不能为nil。 
Ruby代码 
  1. def exception  
  2.     begin  
  3.         raise "exception test."  
  4.     ensure  
  5.         puts $@  
  6.         puts "$@ size is:#{$@.size}"  
  7.     end  
  8. end  
  9.   
  10. exception  

结果: 
引用

simple.rb:58:in `exception': exception test. (RuntimeError) 
from simple.rb:65 
simple.rb:58:in `exception' #$@中的值,是一个数组,第一个元素是错误发生的行数,第二个是异常的内容。下面打印了数组的长度 
simple.rb:65 
$@ size:2 


全局域 
这种类型的变量是整个应用中都可以访问的,而且是同一个变量的引用。是全局作用域的 

$/ 
    输入记录分隔符。默认值为"\n"。 
Ruby代码 
  1. irb(main):076:0> $/  #初始的输入分割符  
  2. => "\n"  
  3. irb(main):077:0> gets  
  4. => "\n"  
  5. irb(main):078:0> "test" #输入回车之后,默认插入"\n",输入结束  
  6. => "test"  
  7. irb(main):079:0> $/="@" #修改输入符为"@"  
  8. => "@"  
  9. irb(main):080:0> gets   #输入回车之后没有结束读取进程,直到输入"@"之后结束  
  10. test  
  11. @  
  12. => "test\n@"  


$\ 
    输出记录分隔符。print会在最后输出该字符串。 
    默认值为nil,此时不会输出任何字符。 
Ruby代码 
  1. irb(main):082:0> print "abc"  
  2. abc=> nil  
  3. irb(main):083:0> $\="@"  
  4. => "@"  
  5. irb(main):084:0> print "abc"  
  6. abc@=> nil  


$, 
    默认的切分字符。若Array#join中省略了参数时或在print的各个参数间将会输出它。 
    默认值为 nil ,等同于空字符串。 
Ruby代码 
  1. irb(main):087:0> ["a","b","c"].join  
  2. => "abc"  
  3. irb(main):088:0> $,=","  #修改切分字符为","  

TAG:

 

评分:0

我来说两句

日历

« 2024-05-06  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 28859
  • 日志数: 40
  • 建立时间: 2008-11-24
  • 更新时间: 2010-05-20

RSS订阅

Open Toolbar