`
meladet
  • 浏览: 27241 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

常见的ruby内部变量

    博客分类:
  • 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"

$`
    在当前作用域中,正则表达式最后一次匹配成功的字符串前面的字符串.若最后的匹配失败则为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", "."]
分享到:
评论
6 楼 thihy 2009-09-02  
《Programming Ruby》中很详细...所有的都有...
5 楼 meladet 2009-07-17  
呵呵,最近在Rails的源码,发现里面用到很多这样的变量,看得异常吃力,所以上找了一些常用的内部变量,做了一个总结,方便以后查找吧
4 楼 ken.wei 2009-07-17  
很不错的所,对初学者很有帮助。
3 楼 Hooopo 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同$<
还有很多已经不推荐使用了,不写了

2 楼 不是流氓 2009-07-17  
投个精华,好多变量在读代码的时候出现过,迷茫的很~
1 楼 qianjigui 2009-07-14  
 
谢谢生动的描述和形象的使用。
学习了~

相关推荐

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    实例变量以`@`开头,它们是对象的私有属性,只能在对象内部访问。每个实例都有自己独立的一套实例变量,互不影响。 ```ruby class Person def initialize(name) @name = name end def introduce puts "Hi, I...

    Ruby语言教程:Ruby 变量示例

    ### Ruby语言教程:深入解析Ruby变量类型 #### 一、引言 在编程语言中,变量扮演着极其重要的角色,它们用于存储数据并在程序运行过程中对其进行操作。Ruby 作为一种动态类型的脚本语言,提供了多种变量类型,使得...

    01Ruby 变量.docx

    例如,在方法内部声明的变量就是局部变量。它们的作用域仅限于定义它们的块或方法内。 ```ruby def example_method variable = "Hello, World!" puts variable end example_method ``` 在这个例子中,`variable`...

    Ruby中类变量和实例变量的比较

    因此,尽管在类体中已经定义了`@num`,但在实例方法内部对其进行赋值时,实际上是创建了一个新的实例变量。此外,`@test`没有被显式初始化,所以在输出时返回了`nil`。 总结来说,类变量和实例变量各有特点,理解...

    ruby教程.rar

    内部变量 内部常数 内部类/模块/异常类 附加库 Ruby变更记录 ruby 1.6 特性 ruby 1.7 特性 ruby 1.8 特性 1.6.8到1.8.0的变更点(总结) ruby 1.9 特性 obsolete 对应DOSISH 附录 疑似BNF的Ruby语法 ...

    Ruby 中$开头的全局变量、内部变量、隐藏变量介绍

    Ruby 中充满了一系列的隐藏变量,我们可以从这些预定义的全局变量中获取一些有意思的信息。 全局进程变量 $$ 表示当前运行的 ruby 进程。 代码如下:&gt;&gt; $$=&gt; 17170我们可以从当前进程杀死它自己 代码如下:&gt;&gt; `kill -9...

    深入分析Ruby 变量

    Ruby是一种动态类型的语言,它提供了丰富的变量类型来存储和操作数据。在Ruby中,有五种主要的变量类型,每种都有其特定的作用域和用途。 1. 变量(Variable):通常以小写字母或下划线开头。它们在局部作用域内...

    .一步一步学RUBY

    他的目标是使Ruby既自然又强大,即使表面上看起来简单,但其内部结构却极为复杂,正如人体一般。 Ruby的诞生之初,并未引起广泛关注,但自1995年公开发布以来,逐渐吸引了全球众多程序员的青睐,特别是在2006年后,...

    Ruby资源ruby-v3.1.1.zip

    3. **Ruby编译器改进**:内部编译器的优化使得代码运行更快,同时减少了内存消耗,提升了整体性能。 4. **线程局部变量**:Ruby 3.1增加了对线程局部变量的支持,这些变量在每个线程中都有独立的副本,提高了多线程...

    Ruby编程Ruby Programming

    - **变量**:Ruby中的变量无需声明类型,直接赋值即可使用。例如:`name = "John Doe"`。 - **数据类型**: - 字符串(String) - 数组(Array) - 哈希(Hash) - 数字(Numeric) - 布尔值(Boolean) #### ...

    Working with Ruby Threads

    - **MRI内部机制**:MRI(Matz's Ruby Interpreter)是Ruby的标准实现,它通过GIL保证了内存安全性和数据一致性。 - **特殊情况:阻塞I/O操作**:当线程执行阻塞I/O操作时,GIL会被释放,允许其他线程执行。 #### ...

    From Java to Ruby

    Ruby的块和闭包是其独特之处,它们提供了强大的控制流和数据处理能力,这是Java中匿名内部类和接口不能比拟的。 其次,Ruby的语法简洁明了,例如,方法调用可以省略括号,变量声明不需要特定关键字,这使得代码看...

    Ruby类实例变量、类实例方法和类变量、类方法的区别

    首先,类实例变量和类实例方法都属于对象的内部状态和行为,而类变量和类方法则是与整个类相关联的全局状态和行为。我们从以下几个方面来探讨这些概念的区别: 1. 类实例变量: 类实例变量是在类的实例方法中定义的...

    ruby 中文文档 必备资料

    Ruby支持四种基本变量:局部变量、实例变量、类变量和全局变量,它们分别以小写字母、@、@@和$开头。数据类型则包括字符串、数字、布尔值、数组、哈希等。控制结构包括条件语句(如if/else,case)和循环(如while、...

    ruby-debug-1.87.rar

    3. `ruby_core_source-0.1.5.gem`:这个组件提供了对Ruby内核源码的访问,使得调试器可以获取到关于Ruby内部操作的详细信息。这对于深入理解Ruby引擎的工作原理,以及调试涉及到Ruby核心部分的问题非常有帮助。 ...

    Ruby元编程 源代码 Metaprogramming Ruby source code

    6. **常量、变量和符号**:Ruby的常量、局部变量和符号在运行时也可以被查询和修改,尽管常量的修改可能会导致警告。 7. **Closures和Proc对象**:Ruby的lambda和Proc对象是闭包,它们能捕获定义时的环境并保存下来...

    Ruby入门教程 pdf文字版

    - **变量**:Ruby中的变量分为局部变量、实例变量、类变量和全局变量,它们都有不同的标识符前缀,如 `$`、`@`、`@@` 和 `local_var`。 - **数据类型**:Ruby是动态类型语言,包括字符串、整数、浮点数、布尔值、...

    ruby-2.6.3源码压缩包

    同时,通过阅读源码,开发者可以深入理解Ruby的内部机制,学习如何实现一个动态语言的编译器和运行时系统。这对于想要参与Ruby核心开发或者希望提升编程技能的人来说,是一份宝贵的资源。 为了编译和运行Ruby源码,...

    ruby 中文 教程 从入门到精通

    - **标识名和变量作用域**:Ruby中的变量根据作用域可分为局部变量、实例变量、类变量和全局变量。 - **数据类型**:Ruby支持多种内置的数据类型,如整型、浮点型、字符串、数组、哈希等。 - **赋值和条件运算符**:...

    ruby脚本交互.rar

    通过命令行参数,我们可以传递参数给Ruby脚本并在脚本内部处理。标准输入/输出则允许脚本与用户或其它程序进行数据交换。文件操作允许脚本读写文件,实现数据持久化。网络通信则支持HTTP、TCP/IP等协议,使得脚本...

Global site tag (gtag.js) - Google Analytics