程式扎記: [ Ruby Gossip ] Basic : 類別 - 關於 self

標籤

2014年11月7日 星期五

[ Ruby Gossip ] Basic : 類別 - 關於 self

Source From Here 
Preface 
在 Ruby 中,self 代表預設的訊息接收者,不同的範圍或呼叫方式,self 代表的物件也不相同。在頂層環境中,self 是參考至一個名稱為 main 的物件,為 Object 的實例: 
>> self.is_a? Object
=> true
>> self
=> main
>> self.instance_of? Object
=> true

關於 self 
在頂層環境中定義方法,相當於在 Object 類別中定義私有實例方法。例如: 
  1. def some  
  2.     puts "Some"  
  3. end  
相當於如下定義: 
  1. class Object  
  2.     def some  
  3.         puts "Some"  
  4.     end  
  5.     private :some  
  6. end  
在 Ruby 中呼叫方法時沒有指定訊息接收者,那麼預設的訊息接收者就是self,在頂層環境時,self 代表 Object 實例,也因此在頂層環境中定義的方法,可以在類別、方法之中直接呼叫。不過 Ruby 中,private 方法不需也不能透過 self 呼叫。例如: 
 

private 方法不需也不能透過 self 呼叫的唯一例外,是在類別中的方法呼叫指定方法時。例如: 
 

在上例的 initialize 方法中,想呼叫 private 的 value 方法將值指定給實例變數 @value,由於 Ruby 中若發現=指定,會將值指定給區域變數,為了區別,這種情況下必須使用 self 明確指定,是要呼叫 value() 方法,而不是設定區域變數,如果沒有指定 self,就會如下: 
 

在單例方法或實例方法中,self 代表呼叫方法時逗號左邊的物件。例如: 
 

在類別本體中,self 代表類別本身也就是 Class 實例)。例如: 
 

所以,在定義類別方法時,可以使用 self 代替具體的類別名稱。例如: 
  1. class Some  
  2.     def Some.action  
  3.         puts "Some.action"  
  4.     end  
  5. end  
可以改用以下的寫法,如此以後修改類別名稱,就不用特別再修改類別方法前的名稱: 
  1. class Some  
  2.     def self.action  
  3.         puts "Some.action"  
  4.     end  
  5. end  
在 單例方法、實例方法、類別方法 中談過,類別方法實際上是類別的單例方法,所以在類別方法中,self 就是代表類別。例如: 

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!