Ruby 元编程一书中有提到了使用 respond_to? 可以询问对象是否能够响应对应方法,当一个方法没有定义时 respond_to? 会调用 respond_to_missing? 方法来返回结果
我看了一下 respond_to_missing? 的方法说明,感觉没太看明白。
主要这句说明:"Hook method to return whether the obj can respond to id method or not. ",这个钩子函数是什么意思?还有就是我如果不覆写 respond_to_missing?方法的话,当我询问一个幽灵方法时,它会返回一个 false,不是很理解(至少函数说明中没有明确说明)
class Demo
def method_missing(name, *args)
super if name.to_s != 'hello'
p "method name: #{name}, args: #{args}"
end
def respond_to_missing?(method, include_private=false)
end
def exists_method
end
end
a = Demo.new
a.hello(1, 2) # 成功调用
# a.hello2 # 抛出NoMethodError
p "respond_to: #{a.respond_to?('exists_method')}" #=> true
# 在调用 respond_to? 方法时,如果方法是一个幽灵方法,它会调用 respond_to_missing? 方法确定返回值
p "respond_to: #{a.respond_to?('hello')}" #=> false