Ruby元編程筆記 - 類中的魔法

Ruby元編程筆記 - 類定義

類定義揭秘

  • 在類定義中,self就是正在定義的類。
  • 所有使用def定義的方法都成了self的實例方法
  • classmodule會打開一個類/模塊。它們的局限是需要一個常量名字來打開類/模塊。
  • Module#class_eval()會在一個已存在的類的上下文中執(zhí)行一個block。
  • Object#instance_eval()僅僅修改當(dāng)前類,而Module#class_eval()會同時修改self和當(dāng)前類。通過修改當(dāng)前類,class_eval()實際上是重新打開了該類,就像class所做的一樣。
  • Module#class_eval()可以通過變量來打開一個類,并且是Flatten Scope,而class只能通過一個常量來打開類,并且會打開一個新的Scope。
  • 不要使用類變量(@@),而使用類實例變量。

Singleton Methods

因為類也是對象,所以可以通過def self.func()來定義類實例方法(在C系語言里對應(yīng)的概念是靜態(tài)方法),并且在其中可以定義類實例變量。

self實際上是當(dāng)前類的一個對象,所以其實我們可以對某個對象(比如obj)做如下操作:def obj.to_s() ...。而這便是單件方法了。

Alias

alias_method似乎能拷貝方法。所以有環(huán)繞別名(Around Alias)這樣的編程方法:對一個已有的方法alias之后,重定義這個方法,在新的方法里調(diào)用老的方法。如:

alias_method original_require require

def require(path)
  ...
  original_require path
  ...
end

所以,alias總是被用在“裝飾器模式”中。

WARNING
  1. 環(huán)繞別名實際上是Monkey Patch. 很有可能會破壞原有代碼。
  2. 永遠(yuǎn)不要把一個環(huán)繞別名加載兩次!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評論 19 139
  • 對象模型 所有class定義之外的代碼默認(rèn)運行在頂級對象main中。 打開類 ruby的class更像是一個作用于...
    五月的約修亞閱讀 3,542評論 0 4
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 4,204評論 1 10
  • 1、baseline 崩潰信息:'Unable to create description in descript...
    千煌89閱讀 4,785評論 3 29
  • 從天際泛白開始,趙老就睜開了眼睛,他環(huán)顧病房的四周,空蕩蕩的只有他一人。不知從何時起,每一個清晨他都有種不知身在何...
    燈火如初閱讀 355評論 0 0

友情鏈接更多精彩內(nèi)容