全域變數 $xx
物件變數 @xx
局部變數 [a-z]xx
常量 [A-Z]xx
兩個偽變數self和nil:
self實際上是一個指向當前對象的全域變數,這個變數的值由解譯器控制,我們只能讀取,不能修改。
nil也是一個由解譯器控制全域變數,不能進行賦值。
1. 全域變數 $xx
全域變數應該謹慎使用,因為它的範圍是指令碼級,在當前會話中的任何位置都可以改變。
全域變數在初始之前訪問的話 是nil
可以通過trace_var來監視全域變數的改變並綁定一個變數改變時做出響應的代碼塊。trace_var :$abc, proc{print "$abc is now #{$abc.to_s}\n"}
$abc = 2
上面就是使用trace_var註冊了一個$abc改變時的事件,對於這種作為過程激發器的全域變數在ruby中通常被稱為 活動變數 active variable。
還有一個特殊的全域變數,通常是系統變數,表示環境內容資訊的,列舉如下
$$ Ruby解譯器的進程ID
$! 最近一次錯誤資訊
$@ 錯誤產生的位置
$_ gets最近讀到的字串
$. 解譯器最近讀到的行數
$~ 子運算式組的最近一次匹配
$n 最近匹配的第n個子運算式
$= 是否區別大小寫標誌
$/ 輸入記錄分隔字元
$\ 輸出記錄分隔字元
$0 Ruby指令碼的檔案名稱
$* 命令列參數
$? 最近一次執行的子進程退出狀態
2 物件變數 @xx
物件變數的範圍在對象內部,初始之前訪問的話,會得到一個nil。
Ruby的物件變數使用之前不用聲明,直接使用即可,其實物件變數在第一次使用時被動態添加進對象,看下面的sample就知道了class Sample
def setA
@a = 1
end
def setB
@b = 2
end
def show
puts "print instance variables:"
puts self.instance_variables
puts "print end"
end
end
s = Sample.new
s.show #none
s.setA
s.show #only have @a
s.setB
s.show #only @a and @b
3.局部變數 [a-z_]xx
由小寫字母和底線開頭,在第一次賦值前並不包含nil值,第一次賦值就像是一次型別宣告,我想ruby解譯器也是根據第一次聲明來決定該變數的類型的。
局部變數的範圍是所在上下文
4 ruby的常量 [A-Z]xx
常量只能賦值一次,但Ruby目前的版本賦值多次只會產生警告。
常量可以定義在類和模組裡,可以通過::符訪問