ruby 全域變數

來源:互聯網
上載者:User

全域變數由$開頭.它們可以在程式的任何位置訪問到.在初始化前,全域變數有一個特殊的值 nil.

這裡列出了一些以$打頭並跟單個字元的特殊變數.比如,$$包含了Ruby解譯器的進程id,它是唯讀.這裡是主要的系統變數以及它們的含義(細節可在Ruby的參考手冊中查到):

$! 最近一次的錯誤資訊

$@ 錯誤產生的位置

$_ gets最近讀的字串

$. 解譯器最近讀的行數(line number)

$& 最近一次與Regex匹配的字串

$~ 作為子運算式組的最近一次匹配

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

$_

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

Ruby代碼

irb(main):006:0> $_

=> nil

irb(main):007:0> gets

foobar

=> "foobar\n"

irb(main):008:0> $_

=> "foobar\n"

$&

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

Ruby代碼

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.

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"

$`

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

等同於Regexp.last_match.pre_match.

Ruby代碼

irb(main):016:0> $`

=> "" #由於最後匹配成功的內容是foobar,輸入的字串前面沒有別的字元所以是""

$'

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

等同於Regexp.last_match.post_match.

Ruby代碼

irb(main):028:0> $'

=> "baz"

$+

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

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同$<

還有很多已經不推薦使用了,不寫了

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.