Ruby常用的內部變數

來源:互聯網
上載者:User

在ruby程式中,經常會看到一些以$開頭的變數,這些不是指我們自己在程式中設定的全域變數,而是指系統內部已經設定好的變數,他們代表了一些特定的意思,下面搜集了一些常用的內部變數,用一些簡單的代碼說明他們代表的意思:

局部域:

在某一個線程範圍內才能有效,下列也可看做是線程內的局部變數。

PS:這邊講解的幾個變數都是於正則匹配相關的,正則匹配過程的代碼是一樣的,這裡不重複輸入Regex匹配的代碼,只在第一個例子裡給出完整的輸入和輸出,之後的例子只直接輸出變數的值。

$_

gets或readline最後讀入的字串,若遇到EOF則為nil。該變數的範圍是局部域。

irb(main):006:0> $_   => nil   irb(main):007:0> gets   foobar   => "foobar\n"   irb(main):008:0> $_   => "foobar\n"   
$&

在當前範圍中,Regex最後一次匹配成功的字串,若最後一次匹配失敗,則為nil。

irb(main):002:0> $&   => nil   irb(main):010:0> /(foo)(bar)(BAZ)?/ =~ "foobarbaz"   => 0   irb(main):011:0> $&   => "foobar"   
$~

在當前範圍中,最後一次匹配成功的相關資訊(MatchData對象——為處理與Regex的匹配過程相關的資訊而設定的類)。可以使用$~[n]的形式從該資料中抽取第n個匹配結果($n),相當於是$1、$2……等同於Regexp.last_match。

irb(main):012:0> $~   => #   irb(main):026:0> $1   => "foo"   irb(main):027:0> $~[1]   => "foo"    
$`

在當前範圍中,Regex最後一次匹配成功的字串前面的字串。若最後的匹配失敗則為nil,等同於Regexp.last_match.pre_match。

irb(main):016:0> $`   => ""  #由於最後匹配成功的內容是foobar,輸入的字串前面沒有別的字元所以是""     
$'

在當前範圍中,Regex最後一次匹配成功的字串後面的字串。若最後的匹配失敗則為nil,等同於Regexp.last_match.post_match。

irb(main):028:0> $'   => "baz" 
$+

在當前範圍中,Regex最後一次匹配成功的字串部分中,與最後一個括弧相對應的那部分字串。若最後的匹配失敗則為nil。在多項選擇型匹配模型中,若您無法斷定是哪個部分匹配成功時,該變數將會非常有用。

irb(main):029:0> $+   => "bar"   
$1
$2
$3 ...

在當前範圍中,Regex最後一次匹配成功的字串部分中,與最後一個括弧相對應的那部分字串,若最後的匹配失敗則為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 ,等同於Null 字元串。

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同$
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.