Ruby 類別變數
類別變數,有時也稱靜態變數,簡單說就是專屬於類別的變數,不依實體不同而有所差異,類別成員下皆共享的,因為是存在特定的記憶體區塊,所以不會因實體的存活期間所影響。
各個oop語言的類別變數大致的理念都是相同的,用法上可能會略有不同,今次是就來探討ruby
的使用狀況。
類別變數種類
ruby
的類別變數有區分以下兩種,而兩者都可以被類別方法正常存取與使用,但還是有差異如下:
@@var => Class Variable 類別變數
@var => Class Instance Variable 類別實體變數
主要差異為:
1.@@
可以給子類別繼承; @
不可以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
2.@@
雖可以被繼承,但由於所有類別都共用,故@@
更改後也會影響其他類別所擁有的相同@@
;而@
因為不會被繼承所以沒這問題
所以使用@@
的時候請小心,一般來說較常使用@
來當做類別變數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
3.@@
可以給實體方法使用; @
不可以
因為@
對實體方法的角度來看,會當做實體變數去讀取而非類別實體變數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
如果實體方法想使用類別實體變數,那就改讓實體方法去呼叫類別方法即可
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
補充
換種類別方法定義的方式來看更複雜一點的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
看來我們無法在class << self
的裡面直接定義@
的類別實體變數,若非要在該區塊內設定@
的類別實體變數,得借用類別方法來完成!
參考
Comments
blog comments powered by Disqus