標籤:style blog http color 使用 strong
self,自己,在ruby中表示當前對象或預設對象。程式執行的任一時刻,有且僅有一個self。
1.誰成為self,在什麼位置成為self?
要知道哪個對象是self,就必須知道當前的上下文。上下文主要有頂層上下文,類定義上下文,模組定義上下文,方法定義上下文。可以根據總結的內容進行self的判斷。
上下文 |
例子 |
哪個對象是self |
頂層 |
在任何定義塊之外的代碼 |
main(內建的預設頂層對象) |
類定義 |
class C |
類對象C |
模組定義 |
module M |
模組對象M |
方法定義 |
1 頂層方法 def method_name 2執行個體方法定義 class C def method_name 3模組中的執行個體方法定義 module M def method_name 4單例方法(包括類方法) def obj.method_name |
main(內建的預設頂層對象) C的一個執行個體對象,這個執行個體對象響應method_name方法調用 (1)用M擴充的單個對象 (2)混含了M的類的一個對象執行個體 obj |
1.1頂層中的self
頂層內容相關的self是main,頂層方法的self也是main。main是object的一個對象。
1.2類和模組中定義中的self
類中的self是類對象本身
類中執行個體方法的對象是執行個體對象
模組的self是模組的名字
1.3單例方法中的self
obj作為對象,它的單例方法中的self就是obj。
2.self作為訊息的預設接接收者
方法調用一般是obj.method的方式,用一個圓點標記,左邊是接收者,右邊是方法。但是,當接收者是self的時候,可以省略接收者和圓點。ruby將self當做預設的接收者,意味著你發送的訊息會發給self。即method等價於self.method。
類方法中調用了hello。等價於self.hello。因為在類中,相當於A.hello,列印出了”hello world“。在類外使用hello時,self是main,沒有這個函數,所以報錯。用A.hello當然是對的。
但是值得注意的是,在調用寫方法(以等號結束的方法)的時候,即使是發送訊息給當前的self,也不能省略。例如調用方法venue=,要寫成self.venue ="hello"。如果寫成venue="hello",ruby則將它解釋為對局部變數的賦值。
3執行個體變數和self
ruby中執行個體變數是以@開頭的變數。值得注意的是,在ruby程式中看到的任何執行個體變數,都是屬於程式中該位置的當前對象self。
第一個@var是屬於類A的,因此在建立類之後就執行了,列印出hello。方法中的@var是屬於類的執行個體對象的,因此在建立A的執行個體對象之後調用方法,列印出world。這兩個@var完全無關。任何對象都可以有執行個體變數--它的資訊和對象狀態的私人儲存處。