ruby中的self

self,本身,在ruby中表示當前對象或默認對象。程序執行的任一時刻,有且僅有一個self。ruby

 

1.誰成爲self,在什麼位置成爲self?函數

要知道哪一個對象是self,就必須知道當前的上下文。上下文主要有頂層上下文,類定義上下文,模塊定義上下文,方法定義上下文。能夠根據下圖總結的內容進行self的判斷。spa

上下文   例子 哪一個對象是self
頂層 在任何定義塊以外的代碼 main(內建的默認頂層對象)
類定義 class C 類對象C
模塊定義 module M   模塊對象M
方法定義

1 頂層方法3d

def method_name對象

 

2實例方法定義blog

class Ctable

  def method_nameclass

 

3模塊中的實例方法定義變量

module Mmodule

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徹底無關。任何對象均可以有實例變量--它的信息和對象狀態的私有存儲處。

相關文章
相關標籤/搜索