Ruby元编程笔记 - 方法

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()的时候要注意以下几点:

  1. 必须对请求做判断,当请求不符合条件的时候直接调用super;
  2. 覆写respond_to?,保持逻辑一致性;
  3. 注意不要让方法重名,如果难以避免的话,那么可以新建一个“白板类(BlankSlate)”,使用undef_method()移除不需要的类。:__send__, :__id__, :instance_eval是必须要留下的。

额外知识点:delegate、const_missing()、remove_method()

你可能感兴趣的:(Ruby元编程笔记 - 方法)