浏览 5350 次
锁定老帖子 主题:常见的ruby内部变量
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-14
最后修改:2009-07-14
局部域: 在某一个线程作用域内才能有效,下列也可看做是线程内的局部变量. 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" $` 在当前作用域中,正则表达式最后一次匹配成功的字符串前面的字符串.若最后的匹配失败则为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 ... 分别存储着最后一次模型匹配成功时与第n个括号相匹配的值.若没有相应的括号时,其值为nil.等同于Regexp.last_match[1], Regexp.last_match[2],... irb(main):030:0> $1 => "foo" irb(main):031:0> $2 => "bar" irb(main):032:0> $3 => nil 线程局部域 下列变量在一个线程内部时是全局域变量,但在不同的线程之间是彼此独立的. $! 最近发生的异常的信息.由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", "."] 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-14
谢谢生动的描述和形象的使用。 学习了~ |
|
返回顶楼 | |
发表时间:2009-07-17
投个精华,好多变量在读代码的时候出现过,迷茫的很~
|
|
返回顶楼 | |
发表时间:2009-07-17
不是流氓 写道 投个精华,好多变量在读代码的时候出现过,迷茫的很~
额,这个一般书上后面的附表都有,不过楼主写的的确很详细~~ 还有一些全局常量: 1.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: HOMEPATH=>\Documents and Settings\xp2008 include=>C:\Program Files\Microsoft Visual Studio\VC98\atl\include;C:\Program F les\Microsoft Visual Studio\VC98\mfc\include;C:\Program Files\Microsoft Visual tudio\VC98\include INPUTRC=>c:\ruby\bin\inputrc.euro JAVA_HOME=>C:\Program Files\Java\jdk1.7.0\ LANG=>zh_CN lib=>C:\Program Files\Microsoft Visual Studio\VC98\mfc\lib;C:\Program Files\Mic osoft Visual Studio\VC98\lib LOGONSERVER=>\\HOOOPO MSDevDir=>C:\Program Files\Microsoft Visual Studio\Common\MSDev98 NUMBER_OF_PROCESSORS=>1 OS=>Windows_NT Path=>C:\Program Files\PC Connectivity Solution\;C:\Perl\site\bin;C:\Perl\bin;C \ruby\bin;C:\Tcl\bin;c:\program files\imagemagick-6.4.1-q8;C:\WINDOWS\system32; :\WINDOWS;C:\WINDOWS\system32\WBEM;C:\Program Files\Ringz Studio\Storm Codec\QT ystem\;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;c:\Program Files\Mic osoft SQL Server\90\Tools\binn\;C:\Program Files\Java\jdk1.7.0\;C:\Program File \e\cmd;C:\Program Files\Git\cmd;C:\Program Files\Git\bin;C:\Program Files\Java\ dk1.7.0\;C:\Program Files\Microsoft Visual Studio\Common\Tools\WinNT;C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program Files\Microsoft Vis al Studio\Common\Tools;C:\Program Files\Microsoft Visual Studio\VC98\bin;C:\Sho s\0.r1134\..;c:\python25\;C:\Shoes3\0.r1243\.. PATHEXT=>.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.tcl PROCESSOR_ARCHITECTURE=>x86 PROCESSOR_IDENTIFIER=>x86 Family 15 Model 4 Stepping 9, GenuineIntel PROCESSOR_LEVEL=>15 PROCESSOR_REVISION=>0409 ProgramFiles=>C:\Program Files PROMPT=>$P$G QTJAVA=>C:\Program Files\Ringz Studio\Storm Codec\QTSystem\QTJava.zip RUBYOPT=>-rubygems SESSIONNAME=>Console SST_FASTMEM=>1 SST_SWAP_EN_WAIT_ON_VSYNC=>0 SystemDrive=>C: SystemRoot=>C:\WINDOWS TEMP=>C:\DOCUME~1\xp2008\LOCALS~1\Temp TMP=>C:\DOCUME~1\xp2008\LOCALS~1\Temp USERDOMAIN=>HOOOPO USERNAME=>xp2008 USERPROFILE=>C:\Documents and Settings\xp2008 VS80COMNTOOLS=>C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\ windir=>C:\WINDOWS 2.DATA,读取__END__后程序行的输入流。如果__END__未出现在代码中则无定义。 3.STDERR,STDIN,STDOUT 标准输入、输出、错误流 4.RUBY_PLATFORM,ruby解释器平台 irb(main):008:0> RUBY_PLATFORM => "i386-mswin32" 5.ARGF同$* , ARGF同$< 还有很多已经不推荐使用了,不写了 |
|
返回顶楼 | |
发表时间:2009-07-17
很不错的所,对初学者很有帮助。
|
|
返回顶楼 | |
发表时间:2009-07-17
呵呵,最近在Rails的源码,发现里面用到很多这样的变量,看得异常吃力,所以上找了一些常用的内部变量,做了一个总结,方便以后查找吧
|
|
返回顶楼 | |
发表时间:2009-09-02
《Programming Ruby》中很详细...所有的都有...
|
|
返回顶楼 | |