• 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> $~   
    => #   
    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同$<

  • 相关阅读:
    主流液晶显示器尺寸参数
    不能访问网络位置的解决方法(转)
    打开Word提示你正试图运行的函数包含有宏或需要宏语言支持的内容
    教你如何防“蹭网”
    ASA数据库瘦身(原创)
    多种解决:“Word无法启动转换器mswrd632.wpc”方法
    百兆线与千兆线网线制作方法
    linux常用命令
    DefaultIfEmpty
    实现手机发送验证码 进行验证
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1529237.html
Copyright © 2020-2023  润新知