Source From Here
Preface
就目前為此,你已經知道實例方法、類別方法與單例方法,也已經看過類別、模組,那麼如果你有個物件 o,打算呼叫某個實例方法 some,那查找方法的順序為何?大致可循以下順序:
方法查找順序
可以實際撰寫簡單的測試:
以上 Other 僅繼承 Some,使用的是繼承下來的實例方法。若再 include 模組:
模組覆蓋了 Some 的 some 定義,使用的是模組的 some 定義。若再於 Other 中定義方法:
再度定義的方法覆蓋了模組的 some 定義,若再於物件定義單例方法:
則單例方法會覆蓋 Other 定義的some方法。
先前談過,可以使用 remove_method 移除實例方法,但僅能移除類別中定義的方法,繼承下來的方法或 include 進來的方法無法移除。例如:
你可以使用 undef_method 讓方法查找失效 (連父類別與模組上的同名方法都會失效),想回復方法查找,可重新於類別中重新定義同名方法。
Supplement
* Blog - How Ruby method dispatch works
Preface
就目前為此,你已經知道實例方法、類別方法與單例方法,也已經看過類別、模組,那麼如果你有個物件 o,打算呼叫某個實例方法 some,那查找方法的順序為何?大致可循以下順序:
方法查找順序
可以實際撰寫簡單的測試:
以上 Other 僅繼承 Some,使用的是繼承下來的實例方法。若再 include 模組:
模組覆蓋了 Some 的 some 定義,使用的是模組的 some 定義。若再於 Other 中定義方法:
再度定義的方法覆蓋了模組的 some 定義,若再於物件定義單例方法:
則單例方法會覆蓋 Other 定義的some方法。
先前談過,可以使用 remove_method 移除實例方法,但僅能移除類別中定義的方法,繼承下來的方法或 include 進來的方法無法移除。例如:
你可以使用 undef_method 讓方法查找失效 (連父類別與模組上的同名方法都會失效),想回復方法查找,可重新於類別中重新定義同名方法。
Supplement
* Blog - How Ruby method dispatch works
沒有留言:
張貼留言