Ruby中method_missing的来源与调用机制技术问询
关于Ruby中
method_missing的常见疑问 先看你提到的现象:
irb(main):020> "".respond_to? "method_missing" => false
1. method_missing的来源
method_missing确实是通过继承得到的,它定义在Ruby所有对象的根类BasicObject中,所以所有Ruby对象都继承了这个方法。但它是内核层面的特殊方法,默认不会被respond_to?检测到——如果要让respond_to?返回真实结果,需要传入第二个参数include_private并设为true:
irb(main):021> "".respond_to? "method_missing", true => true
2. method_missing的调用机制
Ruby方法调用的完整流程是:
- 调用对象方法时,先在对象自身、所属类、父类(一直到
BasicObject)的方法列表中依次查找目标方法 - 若整个查找链走完都找不到目标方法,Ruby不会直接抛出异常,而是自动调用该对象的
method_missing方法,把找不到的方法名、参数、代码块作为参数传入 BasicObject中默认的method_missing实现会抛出NoMethodError,这就是日常看到的方法不存在报错
你可以重写这个方法来做自定义处理,比如:
class MyString < String def method_missing(name, *args, &block) puts "调用了不存在的方法:#{name},参数:#{args}" end end s = MyString.new("test") s.non_existent_method(1, 2) # 输出:调用了不存在的方法:non_existent_method,参数:[1, 2]
3. Ruby如何决定调用method_missing而非直接抛异常?
这是Ruby解释器内置的核心逻辑:方法查找失败是触发method_missing的唯一条件。当完整的方法查找链(对象→类→父类→...→BasicObject)都找不到目标方法时,解释器会自动转向调用当前对象的method_missing,只有当method_missing本身未被自定义处理(比如使用默认实现),才会最终抛出NoMethodError异常。
内容的提问来源于stack exchange,提问作者cluster1
相关产品推荐
相关产品推荐

