跳轉到內容

Ruby 程式設計/語法/變數和常量

來自 Wikibooks,開放世界中的開放書籍

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
  1. a b c d e f g h i j k l m n o p q r s t u v w x y z English.rb 來自 Ruby 1.9.2 標準庫文件
  2. 來自官方 Ruby 文件的關於預定義全域性變數和常量 的文件
上一頁:詞法學 索引 下一頁:字面量
華夏公益教科書