Ruby元編程筆記 - 類定義
類定義揭秘
- 在類定義中,
self就是正在定義的類。 - 所有使用
def定義的方法都成了self的實例方法 -
class或module會打開一個類/模塊。它們的局限是需要一個常量名字來打開類/模塊。 -
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
- 環(huán)繞別名實際上是Monkey Patch. 很有可能會破壞原有代碼。
- 永遠(yuǎn)不要把一個環(huán)繞別名加載兩次!