新手问题 method_missing 的个人理解 (1)

panywhang · 2012年12月18日 · 最后由 neverlandxy_naix 回复于 2012年12月20日 · 2041 次阅读

ruby 的动态性的精华莫过于幽灵方法:methodmissing,如果我们在某一个对象中调用一个方法,ruby 会现在该对象声明的方法中查询,如果没有则向它的父类查询,直至顶层。如果再没有将会调用最底层的 methodmissing 方法,如果 methodmissing 方法中没有对应生命,则会自动向父类寻找,最终会跳转到顶层的 methodmissing 方法,以 method error 异常跳出

那么我们在手动编写 method missing 方法时,有时会遇见以下问题:

class A
  def method_missing
    puts 'OK'
  end
end

class B < A
end

B.new.c

以上代码中,B 类没有声明 c 方法,系统自动向 B 的父类 A 中寻找方法 c,(忽略再向上层寻找),A 中也没有定义 c 方法,那么就会启动 methodmissing 机制,输出 OK 如果 c 不在我们预期的动态方法中,那么我们就应该将 c 作为异常抛出,但 methodmissing 似乎阻止了我们对 method error 异常的处理,怎么办???

class A
  def method_missing(args)
    puts 'OK' if args in [:a, :b] # 我们只预期a和b两个方法
    super
  end
end

向上面这样,将我们的预期方法写在前面,当 c 传入 methodmissing 的时候,系统先对参数进行判断,既不是 a,也不是 b 那么就向下执行 super,调用 A 的父类的 methodmissing 方法,直至顶层并以 method error 跳出

个人感觉楼主的例子侧重的是对方法的重写和 super 的调用。 这其实跟 method_missing 没有什么关系,任何一个方法都可以这样做。 method_missing 主要还是用在元编程这一块了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号