首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > Ruby Rails >

Ruby 惯用内部变量

2012-11-10 
Ruby 常用内部变量局部域:在某一个线程作用域内才能有效,下列也可看做是线程内的局部变量。PS:这边讲解的几

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"
ARGF同$* , ARGF同$<

热点排行