Dynamic Method
通过send()
去动态调用方法:
obj.send(:method, values)
obj.send('method', values)
在Ruby2.2.2中,send()
依然可以调用私有方法。为了避免这个问题我们可以用public_send()
来做限制。
通过define_method来动态定义方法,如:
define_method(name) do |args|
...
end
注意可以通过内省(introspection)来取消更多的重复代码。
method_missing()
覆写method_missing()
的时候要注意以下几点:
- 必须对请求做判断,当请求不符合条件的时候直接调用super;
- 覆写
respond_to?
,保持逻辑一致性; - 注意不要让方法重名,如果难以避免的话,那么可以新建一个“白板类(BlankSlate)”,使用undef_method()移除不需要的类。
:__send__
,:__id__
,:instance_eval
是必须要留下的。
额外知识点:delegate、const_missing()、remove_method()