程式扎記: [ Ruby Gossip ] Basic : 類別 - 單例方法、實例方法、類別方法

標籤

2014年11月2日 星期日

[ Ruby Gossip ] Basic : 類別 - 單例方法、實例方法、類別方法

Source From Here 
Preface 
在 Ruby 中,可以為單一物件定義方法。例如: 
 

上例中,定義於 s1 上的 some 方法,稱為 s1 參考物件的 單例方法Singleton method),僅屬於 s1 參考物件所擁有,同為 Some 實例的 s2 不會擁有該方法。如果想移除物件上的單例方法,可以如下: 
 

實例方法 是定義在類別上,而之後會再談到,單例方法 實際上是定義在物件的匿名單例類別(Anonymous singleton class)上,class << object 語法,就是用來開啟 object 的單例類別,由於 << 在 Ruby 中往往有附加的意涵,而單例類別是沒有名稱的,所以 class << object 也可讀作,在 object 的匿名單例類別中追加定義。 

如果想讓類別實例都擁有的方法,必須在類別中定義: 
 

上例中定義了 Some 的實例方法(Instance method),所有 Some 實例都將擁有該方法。如果想移除實例方法,可以如下: 
 

在 Ruby 中,所有東西都是物件,類別也是物件,具體來說,類別是 Class 實例,既然類別是物件,也就可以為 Class 的實例定義單例方法。例如: 
 

上例也可以改為以下: 
 

通常會稱以上定義了 Some 的 action 類別方法Class method),實際上,類別方法就是 Class 實例上的單例方法,也就是個別類別自己擁有的方法。 

既然類別方法為 Class 實例的單例方法,那麼也就可以如下移除類別方法: 
 

類別方法預設為公開,如果想要將類別方法設為私有,可以使用 private_class_method 方法,反之,則可以使用 public_class_method。例如: 
 

如果你在類別中定義常數,則外界可以透過 類別::常數名稱 來存 取。例如: 
 

可以看到,在類別中定義常數,其實比較是將類別作為名稱空間,為管理變數的一種方式。 

Supplement 
Youtube - Ruby Class & Instance Methods

沒有留言:

張貼留言

網誌存檔

關於我自己

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