ruby中的self

來源:互聯網
上載者:User

標籤: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完全無關。任何對象都可以有執行個體變數--它的資訊和對象狀態的私人儲存處。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.