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

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...