Ruby 程式設計/語法/變數和常量
Ruby 中的變數可以透過其名稱開頭的字元來區分。變數名稱的長度沒有限制(堆大小除外)。
第一個字元指示作用域
- 區域性變數 - 小寫字母或下劃線
- 例項變數 - @
- 在類作用域中,例項變數屬於作為類的物件
- 要在屬於類的物件上定義例項變數,請在 initialize() 中使用 @
- 類變數 - @@
- 全域性變數 - $
- 常量 - 大寫字母
有關與類相關的變數作用域的更多資訊,請參閱 Ruby 程式設計/語法/類。
示例
foobar _foobar
名稱以小寫字母 (a-z) 或下劃線 (_) 開頭的變數是區域性變數或方法呼叫。
區域性變數只能在其初始化塊內訪問。例如
i0 = 1
loop {
i1 = 2
puts defined?(i0) # true; "i0" was initialized in the ascendant block
puts defined?(i1) # true; "i1" was initialized in this block
break
}
puts defined?(i0) # true; "i0 was initialized in this block
puts defined?(i1) # false; "i1" was initialized in the loop
示例
@foobar
名稱以 '@' 開頭的變數是self的例項變數。例項變數屬於 物件 本身。未初始化的例項變數的值為nil.
類變數由類的所有例項共享,並以 '@@' 開頭。示例
@@foobar
需要注意的是,類變數由類的所有後代共享。示例
class Parent
@@foo = "Parent"
end
class Thing1 < Parent
@@foo = "Thing1"
end
class Thing2 < Parent
@@foo = "Thing2"
end
>>Parent.class_eval("@@foo")
=>"Thing2"
>>Thing1.class_eval("@@foo")
=>"Thing2"
>>Thing2.class_eval("@@foo")
=>"Thing2"
>>Thing2.class_variables
=>[]
Parent.class_variables
=>[:@@foo]
這向我們表明,我們所有的類都在更改相同的變數。類變數的行為類似於全域性變數,這些全域性變數僅在繼承樹中可見。因為 Ruby 首先透過查詢繼承樹來解析變數,所以如果兩個子類都添加了同名的類變數,則可能會導致問題。
示例
$foobar
名稱以 '$' 具有全域性作用域;這意味著在執行時,可以在程式中的任何位置訪問它。
用法
FOOBAR
名稱以大寫字母 (A-Z) 開頭的變數是常量。常量可以在初始化後重新分配一個值,但這樣做會生成警告。每個 類 都是一個常量。
嘗試訪問未初始化的常量會引發 NameError 異常。
常量的查詢基於您的作用域或範圍解析運算子(即 '::')。例如
class A
A2 = 'a2'
class B
def go
A2
end
end
end
instance_of_b = A::B.new
a2 = A::A2
另一個示例
class Foo BAR = 123 end puts Foo::BAR # => 123
self
- 當前方法的執行上下文,它可以引用例項、類或模組。
nil
NilClass類的唯一例項。表示空值。
true
TrueClass類的唯一例項。表示真。
false
FalseClass類的唯一例項。表示假。
$1, $2 ... $9
- 這些是正則表示式匹配的捕獲組的內容。它們是當前執行緒和堆疊幀的本地內容!
(在 Ruby 中,nil 也被視為false,其他所有值都被視為true。)偽變數的值不能更改。對偽變數進行替換會導致引發異常。
在處理正則表示式或 Ruby 直譯器引數時,許多預定義變數很有用。
| 名稱 | 別名 | 描述 |
|---|---|---|
$! |
$ERROR_INFO[1] |
由最後一個 'raise'(最後丟擲的異常)設定的異常資訊訊息。 |
$@ |
$ERROR_POSITION[1] |
最後丟擲的異常的反向跟蹤陣列。 |
$& |
$MATCH[1] |
在此作用域中,最後一個成功模式匹配匹配的字串。 |
$` |
$PREMATCH[1] |
最後一個成功匹配左側的字串。 |
$' |
$POSTMATCH[1] |
最後一個成功匹配右側的字串。 |
$+ |
$LAST_PAREN_MATCH[1] |
最後一個成功匹配的最後一個組。 |
$1 到 $9 |
最後一個成功正則表示式匹配的第 N 個組。 | |
$~ |
$LAST_MATCH_INFO[1] |
有關當前作用域中最後一次匹配的資訊。 |
$= |
$IGNORECASE[1] |
不區分大小寫的標誌,預設值為 nil(已棄用)。 |
$/ |
$INPUT_RECORD_SEPARATOR[1],$RS[1] 或 $-0 |
輸入記錄分隔符,預設為換行符。 |
$\ |
$OUTPUT_RECORD_SEPARATOR[1] 或 $ORS[1] |
print 和 IO#write 的輸出記錄分隔符。預設為 nil。 |
$, |
$OUTPUT_FIELD_SEPARATOR[1] 或 $OFS[1] |
print 和 Array#join 的輸出欄位分隔符。 |
$; |
$FIELD_SEPARATOR[1],$FS[1] 或 $-F |
String#split 的預設分隔符。 |
$. |
$INPUT_LINE_NUMBER[1] 或 $NR[1] |
最後讀取的檔案的當前輸入行號。 |
$< |
$DEFAULT_INPUT[1] |
一個物件,提供對作為命令列引數給出的所有檔案內容的連線的訪問,或 $stdin(在沒有引數的情況下)。只讀。 |
$FILENAME |
|
來自 $< 的當前輸入檔案。與 $<.filename 相同。 |
$> |
$DEFAULT_OUTPUT[1] |
Kernel.print 和 Kernel.printf 的輸出目標。預設值為 $stdout。 |
$_ |
$LAST_READ_LINE[1] |
gets 或 readline 的最後一個輸入字串行。 |
$0 |
|
包含正在執行的指令碼的名稱。可能是可分配的。 |
$* |
ARGV[1] |
為指令碼提供的命令列引數。也稱為 ARGV |
$$ |
$PROCESS_ID[1]、$PID[1] 或 Process.pid |
執行此指令碼的 Ruby 程序號。 |
$? |
$CHILD_STATUS[1] |
最後一個執行的子程序的狀態。 |
$: |
$LOAD_PATH |
透過 load 或 require 載入指令碼和二進位制模組的載入路徑。 |
$" |
$LOADED_FEATURES 或 $-I |
包含由 require 載入的模組名稱的陣列。 |
$stderr |
|
當前的標準錯誤輸出。 |
$stdin |
|
當前的標準輸入。 |
$stdout |
|
當前的標準輸出。 |
$-d |
$DEBUG |
-d 開關的狀態。可賦值。 |
$-K |
$KCODE |
原始碼的字元編碼。 |
$-v |
$VERBOSE |
由 -v 開關設定的詳細模式標誌。 |
$-a |
|
如果設定了 -a 選項(“自動分割”模式),則為真。只讀變數。 |
$-i |
|
如果設定了就地編輯模式,則此變數儲存副檔名,否則為 nil。 |
$-l |
|
如果設定了 -l 選項(“行尾處理”已開啟),則為真。只讀變數。 |
$-p |
|
如果設定了 -p 選項(“迴圈”模式已開啟),則為真。只讀變數。 |
$-w |
|
如果設定了 -w 選項,則為真。 |
為了避免批評使用兩個字元、基於標點的變數名過於模糊或令人困惑,標準庫的一部分是“English”,它定義了上面表格中列出的較長名稱。要包含這些名稱,只需按如下方式引入 English 庫即可。[1]
無 ‘English’
$\ = ' -- ' "waterbuffalo" =~ /buff/ print $", $', $$, "\n"
有 English
require "English" $OUTPUT_FIELD_SEPARATOR = ' -- ' "waterbuffalo" =~ /buff/ print $LOADED_FEATURES, $POSTMATCH, $PID, "\n"
請注意,在解析時也有一些預定義的常量,即
__FILE__ (current file) __LINE__ (current line)
和
__dir__ (current directory) __method__ (current method)
(Ruby 2.0 中新增)
可以在 Ruby 語言文件中找到預定義全域性常量的列表。[2] 其中值得注意的是
| 全域性常量名稱 | 描述 |
|---|---|
STDIN
|
標準輸入。$stdin 的預設值。 |
STDOUT
|
標準輸出。$stdout 的預設值。 |
STDERR
|
標準錯誤輸出。$stderr 的預設值。 |
ENV
|
包含當前環境變數的雜湊表。 |
ARGV
|
指令碼給定的命令列引數的陣列。 |
RUBY_VERSION
|
Ruby 語言版本,例如,ruby -e 'puts RUBY_VERSION' 將列印 2.7.0。 |
RUBY_RELEASE_DATE
|
釋出日期字串,例如,2019-12-25。 |
RUBY_PLATFORM
|
平臺識別符號,例如,x86_64-linux-gnu |
RUBY_PATCHLEVEL
|
此 Ruby 的補丁級別,例如,0。如果這是 Ruby 的開發版本,則補丁級別將為 -1。 |