打開類
可以重新打開已經存在的類并對之進行動態修改,即使像String或者Array這樣標準庫的類也不例外。這種行為方式稱之為打開類(open class)
猴子補丁
如果你粗心地為某個類添加了新功能,同時覆蓋了類原來的功能,進而影響到其他部分的代碼,這樣的patch稱之為猴子補丁(Monkeypatch)
類與模塊
Ruby的class關鍵字更像是一個作用域操作符,而不是類型聲明語句。class關鍵字的核心任務是把你帶到類的上下文中,讓你可以在里面定義方法。
每個類都是一個模塊,類就是帶有三個方法(new,allocate,superclass)的增強模塊,通過這三個方法可以組織類的繼承結構,并創建對象
Ruby中的類和模塊的概念十分接近,完全可以將二者相互替代,之所以同時保留二者的原因是為了保持代碼的清晰性,讓代碼意圖更加明確。使用原則:
希望把自己代碼包含(include)到別的代碼中,應該使用模塊 希望某段代碼被實例化或被繼承,應該使用類 模塊機制可以用來實現類似其它語言中的命名空間(Namespace)概念Ruby中的::符號
Ruby中常量的路徑(作用域),類似與文件系統中的目錄,通過::進行分割和訪問,默認直接以::開頭(例: :: Y)表示變量路徑的根位置
什么是對象
對象就是一組實例變量外加一個指向其類的引用。對象的方法并不存在于對象本身,而是存在于對象的類中。
什么是類
類就是一個對象(Class類的一個實例)外加一組實例方法和一個對其超類的引用。Class類是Module類的子類,因此一個類也是一個模塊。
load與require方法的異同
通過load和require都可以進行導入別人的代碼,不同的是load方法用來加載代碼,如果不希望污染當前的命名空間,需要通過load(‘file.rb',true)顯式的要求創建一個匿名模塊來,接管file.rb的常量,require用于導入類庫,此外,就加載次數上load方法每次調用都會再次運行所加載文件,require則對每個庫文件只加載一次。
prepend、include與祖先鏈
祖先鏈用于描述Ruby對象的繼承關系,因為類與模塊是父子關系,所以祖先鏈中也可以包含模塊,prepend與include分別可以向鏈中添加模塊,不同的是調用include方法,模塊會被插入祖先鏈,當前類的正上方,而prepend同樣是插入到祖先鏈,但位置其他卻在當前類的正下方,另外通過Class.ancestors可以查看當前的祖先鏈
private規則
不能通過明確指定接受者來調用私有方法。私有方法只能通過隱性的接受者self調用(Object#send是個例外)
self相關
調用一個方法時,接受者會扮演self角色 任何沒有明確指定接受者的方法調用,都當做是調用self的方法 定義一個模塊(或類)時,該模塊(或類)會扮演self角色
新聞熱點
疑難解答