1. 程式人生 > >3-8《Ruby元編程》

3-8《Ruby元編程》

關鍵字 核方法 ces IT log round cat lookup print

《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?

  1. 查找方法。Method lookup. receiver和ancestors-chain
  2. 執行這個方法。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求精煉,細化:防止猴子補丁的破壞。

  1. 首先,定義一個模塊
  2. 然後,在這個模塊的定義中調用refine方法。
  3. 在一個模塊內部,使用using method_name,細化的作用範圍就限定在該模塊內部了。

3-8《Ruby元編程》