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 跳出