response_to和response_to_missing有何不同?

 百合想你511 发布于 2023-02-08 16:33

我对何时使用每种方法感到困惑。从respond_to?文档:

如果obj响应给定的方法,则返回true 。仅当可选的第二个参数的值为true时,私有方法才包含在搜索中。

如果未实现该方法,例如Windows上的Process.fork,GNU / Linux上的File.lchmod等,则返回false。

如果未定义方法,则response_to_missing?方法被调用并返回结果。

respond_to_missing?

Hook方法,返回obj是否可以响应id方法。

请参阅#respond_to?。

两种方法都带有两个参数。
两种方法似乎都是同一件事(检查某个对象是否响应给定的方法),为什么我们应该同时使用(拥有)这两种方法呢?

定义“ resond_to_missing?”使您能够采用方法:

class A
  def method_missing name, *args, &block
    if name == :meth1
      puts 'YES!'
    else
      raise NoMethodError
    end
  end

  def respond_to_missing? name, flag = true
    if name == :meth1
      true
    else
      false
    end
  end
end

[65] pry(main)> A.new.method :meth1
# => #

为什么respond_to?不能这样做?

我猜:

respond_to? 检查方法是否在:

    当前对象。

    父对象。

    包含的模块。

respond_to_missing? 检查方法是否为:

    通过定义method_missing

通过数组可能的方法:

def method_missing name, *args, &block
  arr = [:a, :b, :c]
  if arr.include? name
    puts name
  else
    raise NoMethodError
  end
end

将其委托给其他对象:

class A
  def initialize name
    @str = String name
  end

  def method_missing name, *args, &block
    @str.send name, *args, &block
  end
end

2。我不知道的其他方式。

两者都应在哪里定义/使用(我也猜):

从1.9.3开始(我记得还不错)仅定义respond_to_missing?但仅使用respond_to?

最后的问题

我对吗?我错过了什么吗?纠正所有不良情况和/或回答此问题中提出的问题

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有