ruby 全局变量

来源:互联网 发布:淘宝是o2o还是b2c 编辑:程序博客网 时间:2024/06/06 16:51

全局变量由$开头.它们可以在程序的任何位置访问到.在初始化前,全局变量有一个特殊的值 nil.

这里列出了一些以$打头并跟单个字符的特殊变量.比如,$$包含了Ruby解释器的进程id,它是只读的.这里是主要的系统变量以及它们的含义(细节可在Ruby的参考手册中查到):

$! 最近一次的错误信息

$@ 错误产生的位置

$_ gets最近读的字符串

$. 解释器最近读的行数(line number)

$& 最近一次与正则表达式匹配的字符串

$~ 作为子表达式组的最近一次匹配

$n 最近匹配的第n个子表达式(和$~[n]一样)

$= 是否区别大小写的标志

$/ 输入记录分隔符

$\ 输出记录分隔符

$0 Ruby脚本的文件名

$* 命令行参数

$$ 解释器进程ID

$? 最近一次执行的子进程退出状态

上面的 $_ 和 $~ 都有作用范围.它们的名字暗示其为全局的,但它们一般都是这样用的,关于它们的命名有历史上的原因.

 

#获取当前的文件名称

puts __FILE__

#获取当前文件的目录名称

puts File.dirname(__FILE__)

#获取当前文件的完整名称

#当要获取完整的路径时需要require 'pathname',代码如下:

require 'pathname'

puts Pathname.new(__FILE__).realpath

#获取当前文件的完整目录

require 'pathname'

puts Pathname.new(File.dirname(__FILE__)).realpath

 

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

局部域:

在某一个线程作用域内才能有效,下列也可看做是线程内的局部变量.

PS:这边讲解的几个变量都是于正则匹配相关的,正则匹配过程的代码是一样的,这里不重复输入正则表达式匹配的代码,只在第一个例子里给出完整的输入和输出,之后的例子只直接输出变量的值

$_

gets或readline最后读入的字符串.若遇到EOF则为nil.该变量的作用域是局部域.

Ruby代码

irb(main):006:0> $_

=> nil

irb(main):007:0> gets

foobar

=> "foobar\n"

irb(main):008:0> $_

=> "foobar\n"

$&

在当前作用域中,正则表达式最后一次匹配成功的字符串.若最后一次匹配失败,则为nil.

Ruby代码

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.

Ruby代码

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.

Ruby代码

irb(main):016:0> $`

=> "" #由于最后匹配成功的内容是foobar,输入的字符串前面没有别的字符所以是""

$'

在当前作用域中,正则表达式最后一次匹配成功的字符串后面的字符串.若最后的匹配失败则为nil.

等同于Regexp.last_match.post_match.

Ruby代码

irb(main):028:0> $'

=> "baz"

$+

在当前作用域中,正则表达式最后一次匹配成功的字符串部分中,与最后一个括号相对应的那部分字符串.若最后的匹配失败则为nil.在多项选择型匹配模型中,若您无法断定是哪个部分匹配成功时,该变量将会非常有用.

Ruby代码

irb(main):029:0> $+

=> "bar"

$1

$2

$3 ...

分别存储着最后一次模型匹配成功时与第n个括号相匹配的值.若没有相应的括号时,其值为nil.等同于Regexp.last_match[1], Regexp.last_match[2],...

Ruby代码

irb(main):030:0> $1

=> "foo"

irb(main):031:0> $2

=> "bar"

irb(main):032:0> $3

=> nil

线程局部域

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

$!

最近发生的异常的信息.由raise设定.

Ruby代码

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。

Ruby代码

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"。

Ruby代码

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,此时不会输出任何字符。

Ruby代码

irb(main):082:0> print "abc"

abc=> nil

irb(main):083:0> $\="@"

=> "@"

irb(main):084:0> print "abc"

abc@=> nil

$,

默认的切分字符。若Array#join中省略了参数时或在print的各个参数间将会输出它。

默认值为 nil ,等同于空字符串。

Ruby代码

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,此时将进行特殊的分割。

Ruby代码

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。

Ruby代码

irb(main):094:0> $$

=> 5167

$:

$LOAD_PATH

包含一个数组,其内容是load或require加载文件时用的搜索目录列表.

Ruby代码

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", "."]

还有一些全局常量:

1.ENV,包含程序的环境变量,是一个Hash对象

Ruby代码

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解释器平台

Ruby代码

irb(main):008:0> RUBY_PLATFORM

=> "i386-mswin32"

5.ARGF同$* , ARGF同$<

还有很多已经不推荐使用了,不写了


转载自:http://www.cnblogs.com/lwm-1988/archive/2012/04/19/2456932.html

原创粉丝点击