Ruby 关于 Ruby 中 respond_to_mssing 的一点困惑

2604249649 · 2023年02月25日 · 最后由 2604249649 回复于 2023年02月26日 · 366 次阅读

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

hook method 是个 stub 方法,相当于一个占位符,通常是在其他方法内部调用。比如 included 这个 hook 会在执行 include 中调用,respond_to_missing?在 respond_to? 中调用。通常 hook method 的默认实现都十分简单(respond_to_missing? 的默认实现就是直接返回 false),或者根本就是个空方法。它真正的业务意义是调用者自己通过 override 实现的。

大致来说,就是方法封装者留出一些空间,让方法调用者自己去注入自定义的逻辑。感觉就像是个模板模式

原来是这个意思,谢谢大佬的解答

2604249649 关闭了讨论。 02月26日 09:16
需要 登录 后方可回复, 如果你还没有账号请 注册新账号