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
沒有留言:
張貼留言