Ruby常用的内部变量

2019-03-02 23:43|来源: 网路

在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> $~   
=> #
      
 
  
          
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 ...

在当前作用域中,正则表达式最后一次匹配成功的字符串部分中,与最后一个括号相对应的那部分字符串,若最后的匹配失败则为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同$<


转自:http://www.cnblogs.com/rubylouvre/archive/2009/07/23/1529237

相关问答

更多
  • VB常用内部函数[2023-09-01]

    Abs Array Asc Atn CallByName Choose Chr Command Cos CreateObject CurDir CVErr Date DateAdd DateDiff DatePart DateSerial DateValue Day DDB Dir DoEvents Environ EOF Error Exp FileAttr FileDateTime FileLen Filter Format FormatCurrency FormatDateTime FormatNum ...
  • 你想要的方法是rb_gv_get (它本身就是一些全局变量的包装)。 用rubyinline你可以写 require 'inline' class Foo inline :C do |builder| builder.c_raw_singleton <
  • 为什么我能够在LinkedList类之外创建Node对象,即使它被声明为私有? 因为ruby常量忽略“常规”可见性修饰符。 他们总是公开的,无论他们在哪个部分。要将它们private_constant私有,请使用private_constant 。 把这个不雅的设计称之为什么,但事实就是这样。 另外,请注意,即使使用private_constant ,私有性也意味着很少。 基本上,它所做的唯一的事情是从列表( LinkedList.constants )和直接解析( LinkedList::Node )中隐 ...
  • 一般来说,如果它不在ruby.h中,那么它不是一个“公共”api,寻找一个名为rb_xxx的方法也可能有所帮助。 GL。 in general if it's not in ruby.h, then it's not a "public" api looking for a method called rb_xxx might also help. GL.
  • 部分渲染发生在 click事件之前 。 事实上,在浏览器收到响应之前,局部呈现在服务器上。 您必须使用XHR来替换#my_destination_div的内容。 请参阅https://api.jquery.com/load/ .load( url [, data ] [, complete ] ) 说明:从服务器加载数据并将返回的HTML放入匹配的元素中。 此方法是从服务器获取数据的最简单方法。 https://api.jquery.com/load/ The rendering of the partia ...
  • 是的,它的确如此。 它适用于所有内置控制结构( while , if , begin ... end ),但不适用于块。 因此,如果您each或each重写代码,它的行为将与您的期望类似。 Yes, it really is how it works. It applies to all built-in control structures (while, for, if, begin ... end), but not to blocks. So if you rewrite your code usi ...
  • 该方法取决于您使用的是哪个Ruby函数API。 如果你使用的是当前的4.x API (你的函数在lib/puppet/functions/*.rb ),那么: if closure_scope['facts']['virtual'] == 'virtualbox' 文档: 在Ruby中编写函数:访问Puppet变量 或者,如果您使用旧版兼容3.x的API(您的函数位于lib/puppet/parser/functions/*.rb ),那么: if lookupvar('virtual') == 'vir ...
  • 在进入循环之前设置它,如: def select_player_symbol(player_1, player_2) player_1_symbol = nil player_2_symbol = nil loop do ... 这是有效的,因为通过建议的更改,player_1_symbol的范围是方法级别。 在它的范围在循环内部之前。 当你离开循环时,你失去了它。 set it before entering the loop like: def select ...
  • Ruby lambda类似于匿名js function : step1 = lambda {puts "I am a lambda!"} step1.call "optional args", ... 一些简写: f = -> {puts "Shorthand lambda"} f.() 更多信息(包括速记符号!!) 在这里 A Ruby lambda is similar to an anonymous js function: step1 = lambda {puts "I am a lambda! ...
  • 这是Ruby访问嵌套函数中的外部变量的副本。 您可以通过调用@rotation将它作为包含对象的实例变量,但为什么不将string和rotation传递给encrypt方法呢? This is a duplicate of Ruby accessing outer variables in nested function. You could make it an instance variable on the containing object by calling it @rotation, but ...