2014年11月22日 星期六

[ Ruby Gossip ] Basic : 模組 - 方法查找順序

Source From Here
Preface
就目前為此,你已經知道實例方法、類別方法與單例方法,也已經看過類別、模組,那麼如果你有個物件 o,打算呼叫某個實例方法 some,那查找方法的順序為何?大致可循以下順序:
1. 查看物件是否定義 some 單例方法
2. 查看物件的類別是否定義 some 實例方法
--2.1 若類別定義了 some 實例方法後,再 include 某模組具有 some 實例方法,則使用的是模組的 some 方法
--2.2 若類別 include 某模組具有 some 實例方法後,再定義了 some 實例方法,則使用的是類別的 some 方法
3. 查看物件的父類別是否定義 some 實例方法

方法查找順序
可以實際撰寫簡單的測試:


以上 Other 僅繼承 Some,使用的是繼承下來的實例方法。若再 include 模組:


模組覆蓋了 Some 的 some 定義,使用的是模組的 some 定義。若再於 Other 中定義方法:


再度定義的方法覆蓋了模組的 some 定義,若再於物件定義單例方法:


則單例方法會覆蓋 Other 定義的some方法。

先前談過,可以使用 remove_method 移除實例方法,但僅能移除類別中定義的方法,繼承下來的方法或 include 進來的方法無法移除。例如:


你可以使用 undef_method 讓方法查找失效 (連父類別與模組上的同名方法都會失效),想回復方法查找,可重新於類別中重新定義同名方法。

Supplement
Blog - How Ruby method dispatch works
I was asking around to see if anyone knew a good, short explanation of Ruby’s object and method dispatch system the other day, and the response from several people was, “no, you should write one.” So, here we are. I’m going to explain how Ruby’s object system works, including method lookup, inheritance, super calls, classes, mixins, and singleton methods...


沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...