Ruby 中充滿了一系列的隱藏變量,我們可以從這些預定義的全局變量中獲取一些有意思的信息。
全局進程變量
$$ 表示當前運行的 ruby 進程。
復制代碼 代碼如下:
>> $$
=> 17170
我們可以從當前進程殺死它自己
復制代碼 代碼如下:
>> `kill -9 #{$$}`
[1] 17170 killed irb
$? 表示最近一個子進程的狀態(tài)
復制代碼 代碼如下:
>> `echo hello`
=> "hello\n"
>> $?
=> #Process::Status: pid 18048 exit 0>
>> $?.success?
=> true
異常和錯誤
$1 表示引起異常的信息。比如在這里 raise "there's no peanut butter",它的值就是 there's no peanut butter。
復制代碼 代碼如下:
>> begin raise "this town ain't big enough for the both of us" rescue puts $! end
this town ain't big enough for the both of us
=> nil
$@ 可以給出完整的引起錯誤的棧調用信息,它是一個數(shù)組。
復制代碼 代碼如下:
>> begin raise 'no soup in kitchen' rescue $@.each { |trace| puts trace } end
(irb):13:in `irb_binding'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/workspace.rb:80:in `eval'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/workspace.rb:80:in `evaluate'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/context.rb:254:in `evaluate'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:159:in `block (2 levels) in eval_input'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:273:in `signal_status'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:156:in `block in eval_input'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:243:in `block (2 levels) in each_top_level_statement'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `loop'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `block in each_top_level_statement'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `catch'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `each_top_level_statement'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:155:in `eval_input'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:70:in `block in start'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:69:in `catch'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:69:in `start'
/home/meck/.rvm/rubies/ruby-1.9.3-p194/bin/>>'
=> ["(>>'"]
字符串和分隔符
$; 表示 String.split 里的分隔符,默認是空格。
復制代碼 代碼如下:
>> "One Spaceship, Two Tiny Tanks, Three Misplaced Socks".split
=> ["One Spaceship", " Two Tiny Tanks", " Three Misplaced Socks"]
>> $; = ","
=> ","
>> "One Spaceship, Two Tiny Tanks, Three Misplaced Socks".split
=> ["One Spaceship", " Two Tiny Tanks", " Three Misplaced Socks"]
$, 用在 Array.join 和 Kernel.print 里,默認是 nil。
>> ['one', 'two', 'three', 'green'].join
=> "onetwothreegreen"
>> $, = "-"
=> "-"
>> ['one', 'two', 'three', 'green'].join
=> "one-two-three-green"
$/ 表述讀取輸入的行分隔符。它被用在 Kernel.gets 里。它通常表示新行,但可以被修改。這個很難展示,因為 irb 依賴 \n 作為讀取分隔符,如果把 $/ 設置成 nil,gets 就會讀取整個文件。
$\ 正好相反,它是作為輸出的行分隔符。
復制代碼 代碼如下:
>> $\ = "mooooooo "
=> "mooooooo "
>> puts a
NameError-: -undefined local variable or method `a' for main:Object-
mooooooo from (irb):25
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/bin/>>'-
mooooooo >> a
文件
假設有個叫l(wèi)etter.text的文件:
復制代碼 代碼如下:
Dear Caroline,
I think we need some honey for tea.
I also think that I may have misplaced my red tie, have you seen it?
-Nick
$. 表示文件當前被讀取的行號。
復制代碼 代碼如下:
>> open('letter.txt').each { |line| puts "#{$.}: #{line}" }
1: Dear Caroline,
2: I think we need some honey for tea.
3: I also think that I may have misplaced my red tie, have you seen it?
4:
5: -Nick
=> #File:letter.txt>
$_ 表示最后讀取的行。
復制代碼 代碼如下:
>> open('letter.txt').each { |line| puts $_.nil? }
true
true
true
true
true
=> #File:letter.txt>
匹配和正則表達式
$~ 表示最近一次正則匹配到的信息,如果有的話它就返回 MatchData 的示例,否則就是 nil。
復制代碼 代碼如下:
>> "the robots are coming, the robots are coming, the robots are coming" =~ /ro/
=> 4
>> $~
=> #MatchData "ro">
>> $~.to_s
=> "ro"
>> "the robots are coming, the robots are coming, the robots are coming" =~ /cats/
=> nil
>> $~
$ 跟 $~ 非常相似,它返回最近一次匹配到的字符串。
復制代碼 代碼如下:
>> "the robots are coming, the robots are coming, the robots are coming" =~ /ro/
=> 4
>> $
$' 表示匹配不分后面的字符串。
復制代碼 代碼如下:
>> "There were once ten tin robots standing in a row." =~ /robot/
=> 24
>> $'
=> "s standing in a row."
=> "ro"
=> nil
其他
$> 表示ruby 默認的輸出對象,用在 Kernel.print 里。
復制代碼 代碼如下:
>> $> = $> = $stderr
=> #IO:STDERR>>
>> puts 'no no no'
no no no
=> nil
>> $> = $stdin
/home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:168:in `write': not opened for writing (IOError)
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:168:in `print'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:168:in `block (2 levels) in eval_input'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:273:in `signal_status'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:156:in `block in eval_input'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:243:in `block (2 levels) in each_top_level_statement'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `loop'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `block in each_top_level_statement'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `catch'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `each_top_level_statement'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:155:in `eval_input'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:70:in `block in start'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:69:in `catch'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb:69:in `start'
from /home/meck/.rvm/rubies/ruby-1.9.3-p194/bin/irb:12:in `main>'
$* 可能是最常用全局變量,它表示包含傳給 ruby 文件的所有變量的數(shù)組,假設有個叫 argument_echoer.rb 文件:
復制代碼 代碼如下:
$*.each { |arg| puts arg }
運行它:
復制代碼 代碼如下:
$ ruby argument_echoer.rb Who What When Where and Why
Who
What
When
Where
and
Why
您可能感興趣的文章:- Ruby基本的環(huán)境變量設置以及常用解釋器命令介紹
- Ruby中變量引用時的一些注意點
- Ruby中類變量和實例變量的比較
- 詳細解析Ruby中的變量
- ruby 局部變量
- ruby 實變量
- 深入分析Ruby 變量