Dynamic Method
通過send()去動態(tài)調(diào)用方法:
obj.send(:method, values)
obj.send('method', values)
在Ruby2.2.2中,send()依然可以調(diào)用私有方法。為了避免這個問題我們可以用public_send()來做限制。
通過define_method來動態(tài)定義方法,如:
define_method(name) do |args|
...
end
注意可以通過內(nèi)省(introspection)來取消更多的重復(fù)代碼。
method_missing()
覆寫method_missing()的時候要注意以下幾點(diǎn):
- 必須對請求做判斷,當(dāng)請求不符合條件的時候直接調(diào)用super;
- 覆寫
respond_to?,保持邏輯一致性; - 注意不要讓方法重名,如果難以避免的話,那么可以新建一個“白板類(BlankSlate)”,使用undef_method()移除不需要的類。
:__send__,:__id__,:instance_eval是必須要留下的。
額外知識點(diǎn):delegate、const_missing()、remove_method()