3-8《Ruby元編程》
第二章 對象模型
類定義揭秘inside class definitions: class關鍵字更像一個作用域操作符,核心作用是可以在裏面隨時定義方法。
[].methods.grep(/^re/):調用 出Array的所有以re開頭的method.
Monkeypatch:涉及全局修改,定義某個方法前應該仔細檢查該類是否已有同名的方法。
實例對象存放在對象中,方法存放在類中。
類的真相:類本身也是對象。Ruby允許在運行時修改類的信息。
Class.instance_methods
Array.superclass =>Object
模塊
類也是模塊,是帶有三個方法new,allocate,superclass的增強模塊。
代碼要include,使用module.代碼需要被實例化或被繼承用class.
類就是一個對象外加一組實例方法和一個對其超類的引用。 類和其他對象一樣必須通過引用來訪問。
2.4What Happends when you call a method?
- 查找方法。Method lookup. receiver和ancestors-chain
- 執行這個方法。self
include:把模塊插到祖先鏈中包含它的該類的後面。先查找該類的method。
prepend: 把模塊插到祖先鏈中包含它的該類的前面。先在prepend 模塊中查找method。
kernel是核心模塊被Object包含了。通過給Kernel模塊加一個方法,就對所有對象可用了。這個方法稱作內核方法.如Awesome_print包的方法ap就用了內核方法。
Method Execution
Ruby的每一行代碼都會在一個對象中被執行--這個對象就是當前對象,self
沒有明確指定receiver的method都在self上調用。
Private私有方法
1.如果調用方法的接收者不是自己,就必須指明接受者
2.私有方法只能通過隱性的接受者self調用。
所以只能在自身中調用私有方法,或者繼承來的私有方法。
在類和模塊定義中,self是這個類或模塊本身。
Refinement求精煉,細化:防止猴子補丁的破壞。
- 首先,定義一個模塊
- 然後,在這個模塊的定義中調用refine方法。
- 在一個模塊內部,使用using method_name,細化的作用範圍就限定在該模塊內部了。
3-8《Ruby元編程》